regex - 正则表达式:如何强制可选组匹配
问题描述
我有一个像这样的正则表达式
set the var (.*) to (.*)(( and )(.*))?
我正在尝试与以下示例文本匹配
set the var VAR to DATA POINT and SEQUENCE
set the var VAR to DATA POINT
set the var VAR to DATA
set the var VAR EXTRA to DATA
https://regex101.com/r/6hbrdw/1如您所见,第一组匹配正确,但第二组在可选和 . * 发生。如果可能的话,有没有办法强制最后几组匹配而不是跳过它们?
这也是 Robot Framework 的正则表达式,因此不支持像外观这样的扩展(?...)
编辑:
你们中的许多人都指出我可以使用这个表达
set the var (.*?) to (.*?)(( and )(.*))?$
为了正确获得匹配,这在在线测试器中有效,但是这个正则表达式在 Robot Framework 中似乎失败了,它被用作如下
set the var ${var1:(.*?)} to ${var2:(.*?)}${var3:(( and )(.*))?$}
它似乎适用于所有 3 个变量并且存在“和”的情况,但是当只有 2 个时,第二组将不匹配任何内容
解决方案
您正在寻找的功能称为“非贪婪量词”,并且被认为是大多数正则表达式引擎的标准部分。
Pythonre
模块在此处记录它:
*?, +?, ??
'*'、'+' 和 '?' 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果 RE
<.*>
与 匹配'<a> b <c>'
,它将匹配整个字符串,而不仅仅是'<a>'
. 在限定符之后添加?
使其以非贪婪或最小方式执行匹配;将匹配尽可能少的字符。使用 RE<.*?>
将只匹配'<a>'
.
所以我相信你正在寻找的规则是:
set the var (.*?) to (.*?)(( and )(.*))?
推荐阅读
- ios - 如何更改导航栏中的图像或图像视图的大小(不是文件大小)
- java - 干净架构中用例类的 java 命名约定是什么?
- java - 从 Java 中的 Map 中删除 Class 对象键
- powershell - 复制 PowerShell 的写入主机行为
- python - 如何使用python在关键字后搜索lxml
- python - 在 python 中处理非数字数据。Python初学者
- fork - XV6 Fork():为什么 parent 先运行?
- android - 错误:无法解析“:app@debug/compileClasspath”的依赖关系:无法解析androidx.legacy:legacy-support-v4:1.0.0,为什么?
- python - Python:附加到列表的字符串不显示
- javascript - 使用 JavaScript 修改 css BackgroundSize 点击