我正在使用正则表达式。我的以下正则表达式符合我的要求:
很久 - 抱歉。它用于解析任意对象的格式字符串。它使我能够指定一个属性(例如IntValue)并将可选的子格式转发给它。
它匹配#
后跟可选的非捕获模式?:
,后跟可选的'选项'模式(?r)
或(?a-r)
。然后是属性名称,后跟一对[]
。
对于以下输入:
Int: #IntValue Bool: #BoolValue[]Word Str: '#StrValue' Double: #DoubleValue[#.00] #(?r)Bar[#(?r)StrValue[#Length]]
匹配:
精细。
但现在我需要所有其他的东西。我想在相同的正则表达式中能够预测所有匹配(我可以通过检查id
或plain
是否有捕获来判断我的情况。)
这样做的默认模式是:((?!<regex that matches what you want>).)*
在我的情况下看起来像(模式:<REG>|(?<plain>(?:(?!<REG>).)+)
)
什么导致巨大的正则表达式(完美的whitch maches):
PUH。它做了它应该做的但是......
还有其他方法可以匹配以前的正则表达式部分所没有的所有内容吗?
这是清楚的吗?
答案 0 :(得分:2)
你很幸运:你的正则表达式以一个锚字符开始,即augtool> ls /files/etc/shadow
augtool> print /files/etc/shadow
augtool>
。我们可以利用这一点。
添加模式的替代方案:#
。这将消耗除|[^#]+
个字符以外的所有字符,将特殊情况从#
开始到模式的第一部分。因此,#
字符将始终开始新匹配。
还有一个小问题:你的第一部分中有两个#
锚定所包围的非可选id
组,这意味着你有一个\b
在输入字符串中没有后跟一个字母(让我们说#
之类的东西),foo#!bar
不会被模式的第二部分匹配。< / p>
此问题的一个简单解决方案是在模式的末尾使用#
来解释此边缘情况。仅当第一个案例失败时,才会匹配第三个|[^#]+|#
案例。