(PHP)正则表达式是:
"/\b(screen|front|glass|lcd)\b.*?\b(not)?\b.*?\b(replaced|cracked|broken|chipped)\b/i"
其目的是使正则表达式匹配这两者:
"screen is not cracked"
"screen is cracked"
拿起不在场的第二组。但是,对于上述两个示例输入,第二个组似乎都是空的。
我做错了什么?
提示:我正在用http://www.regexe.com测试这个
发布于 2015-03-22 05:07:19
您可以将第一个非贪婪的量词放在一个可选的组中,其单词为"not":
\b(screen|front|glass|lcd)\b(?:.*?\b(not)\b)?.*?\b(replaced|cracked|broken|chipped)\b
因此,在非捕获组中,\b(not)\b
不再是可选的,而非贪婪的量词执行其任务,并在到达"not“时停止。
这是一种优化的方法,它懒洋洋地抓住单词直到破译/破译/替换/破碎,并最终捕捉到“不”:
\b(screen|front|glass|lcd)\W+(?>(?:(not)|\w+)\W+)*?(?=[crb])(c(?:racked|hipped)|replaced|broken)\b
发布于 2015-03-22 04:57:54
因为.*?
在匹配可选的模式之前也会贪婪地匹配not
。在这种情况下,您需要使用负前瞻性。
(screen|front|glass|lcd)(?:(?!\bnot\b).)*(not)?.*?(replaced|cracked|broken|chipped)
(?:(?!\bnot\b).)*
将检查要匹配的字符是否是字符串not
中的起始字母。如果是,那么它将匹配以下字符。否则,它将不匹配以下字符,从而导致空匹配(因为*
)。
发布于 2015-03-22 05:01:06
你忘了“是”这个词
m!\b(screen|front|glass|lcd)\b *is *\b(not\b)?(replaced|cracked|broken|chipped)\b!i
https://stackoverflow.com/questions/29194583
复制相似问题