首页 > 解决方案 > 正则表达式:如何强制可选组匹配

问题描述

我有一个像这样的正则表达式

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 个时,第二组将不匹配任何内容

标签: regexrobotframework

解决方案


您正在寻找的功能称为“非贪婪量词”,并且被认为是大多数正则表达式引擎的标准部分。

Pythonre模块在此处记录它

*?, +?, ??

'*'、'+' 和 '?' 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果 RE<.*>与 匹配'<a> b <c>',它将匹配整个字符串,而不仅仅是'<a>'. 在限定符之后添加?使其以非贪婪或最小方式执行匹配;将匹配尽可能少的字符。使用 RE<.*?>将只匹配'<a>'.

所以我相信你正在寻找的规则是:

set the var (.*?) to (.*?)(( and )(.*))?

推荐阅读