正则表达式:
^(\w+,?\s?)+(?=:): hi hey\?$
输入:
^{pr2}$输出:挂起
代码
^{3}$期望的行为:使用以下模式查找字符串
[comma_and_(optionally)space_separated_values][colon][question]
不应匹配的输入示例:
: qqq?
(无值)aa: qqq?
(只有一个值)aa, bb: qqq
(没有问题)aa, : qqq?
(错误值格式)aa, bb, cc:?
(毫无疑问), bb, cc: qqq?
(错误的值格式)应匹配的输入示例:
aa, bb: qq?
aa, b, c,d,e,f, g, h: qq?
aa, bb, cc: qq ee ff gggg hhhh?
由于这种
(\w+)+
方案,它挂起。一、 e.故障时太复杂。
如果匹配,效果很好,失败时会爆炸。在
此
(\w,?\s?)+
与(\w+,?\s?)+
相同,但不会挂起。在所以,把它改成这个
^(\w,?\s?)+(?=:): hi hey\?$
,问题就解决了。在作为奖励,这个
^(\w,?\s?)+: hi hey\?$
是相同的。在另外,您可以用
.*?\?$
代替文本hi hey\?$
如果应为变量文本。在
编辑:
注意总是嵌套量词的潜在问题总是
一、 那些贪婪的和开放的,比如(b
+
)*
。在这几乎可以通过移除内部嵌套(如示例中的
b+
)来解决。通过不量化,我们可以称之为伪锚。在
也就是说,它应该是组中第一个的,并且是一个未量化的、必需的特征。在
这将迫使回溯上的引擎再次转到该字符进行检查。
如果不量化,它会立即放弃,甚至不看
表达式的其余部分。
因此,它会越过字符串中的那个位置来找到next文本
b
。在这就是回溯治疗的基本原理。在
考虑到回溯的缺陷,我们可以制定一个解决方案来获得所需的匹配。在
^\s*(\w+\s*(?:[,\s]\s*\w+\s*)+)\s*:\s*([^:]*?\w[^:]*?)\s*\?\s*$
Formatted
^{pr2}$相关问题 更多 >
编程相关推荐