我有一个如下所示的字符串:
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:
应该等同于空格字符。
答案 0 :(得分:2)
对于条件捕获,您可以执行(?:xyz)?
之类的操作,其中xyz
是条件模式。
VAL\s*"(.*?)"\s*
VAL2\s*"(.*?)"\s*
VAL3\s*"(.*?)"\s*
(?:OPTIONALVAL\s*"(.*?)"\s*)?
SPECIALVAL
请注意,实时预览启用了扩展标记,以忽略这些换行符。
正如你的问题反映出你想要捕捉VAL
等等。那么你当然需要用括号括起它们。
需要注意的是,是否存在条件捕获。所有捕获组仍将保持相同的索引。