正则表达式,可选择在字符串末尾捕获3个组

时间:2017-04-02 06:13:18

标签: regex

我有一个如下所示的字符串:

VAL "foo"
VAL2 "bar"
VAL3 "barbar"
OPTIONALVAL "optionalvalue"
SPECIALVAL "optionalval"

OPTIONALVAL是可选的(可能显示也可能不显示),如果显示,则第二列中有一个值对(示例中为"optionalvalue"),SPECIALVAL为也是可选的,但在第二列中没有配对值。

这是我的正则表达式,但如果缺少OPTIONALVAL,它就不会匹配任何内容(应该匹配所有其他没有丢失的内容)!

 "^[[:space:]]*"
 "(VAL)[[:space:]]*\"(.*)\"[[:space:]]*"
 "(VAL2)[[:space:]]*\"(.*)\"[[:space:]]*"
 "(VAL3)[[:space:]]*\"(.*)\"[[:space:]]*"
 "(OPTIONALVAL)?[[:space:]]*\"(?(7)(.*))\"[[:space:]]*"; // conditional capture
 "(SPECIALVAL)?[[:space:]]*";

我做错了什么? (我正在使用Boost正则表达式,:space:应该等同于空格字符。

1 个答案:

答案 0 :(得分:2)

对于条件捕获,您可以执行(?:xyz)?之类的操作,其中xyz是条件模式。

VAL\s*"(.*?)"\s*
VAL2\s*"(.*?)"\s*
VAL3\s*"(.*?)"\s*
(?:OPTIONALVAL\s*"(.*?)"\s*)?
SPECIALVAL

Live preview

请注意,实时预览启用了扩展标记,以忽略这些换行符。

正如你的问题反映出你想要捕捉VAL等等。那么你当然需要用括号括起它们。

需要注意的是,是否存在条件捕获。所有捕获组仍将保持相同的索引。