首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式不拾取中间组

正则表达式不拾取中间组
EN

Stack Overflow用户
提问于 2015-03-22 04:50:20
回答 3查看 48关注 0票数 0

(PHP)正则表达式是:

代码语言:javascript
运行
AI代码解释
复制
"/\b(screen|front|glass|lcd)\b.*?\b(not)?\b.*?\b(replaced|cracked|broken|chipped)\b/i"

其目的是使正则表达式匹配这两者:

代码语言:javascript
运行
AI代码解释
复制
"screen is not cracked"
"screen is cracked"

拿起不在场的第二组。但是,对于上述两个示例输入,第二个组似乎都是空的。

我做错了什么?

提示:我正在用http://www.regexe.com测试这个

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-22 05:07:19

您可以将第一个非贪婪的量词放在一个可选的组中,其单词为"not":

代码语言:javascript
运行
AI代码解释
复制
\b(screen|front|glass|lcd)\b(?:.*?\b(not)\b)?.*?\b(replaced|cracked|broken|chipped)\b

因此,在非捕获组中,\b(not)\b不再是可选的,而非贪婪的量词执行其任务,并在到达"not“时停止。

这是一种优化的方法,它懒洋洋地抓住单词直到破译/破译/替换/破碎,并最终捕捉到“不”:

代码语言:javascript
运行
AI代码解释
复制
\b(screen|front|glass|lcd)\W+(?>(?:(not)|\w+)\W+)*?(?=[crb])(c(?:racked|hipped)|replaced|broken)\b
票数 1
EN

Stack Overflow用户

发布于 2015-03-22 04:57:54

因为.*?在匹配可选的模式之前也会贪婪地匹配not。在这种情况下,您需要使用负前瞻性。

代码语言:javascript
运行
AI代码解释
复制
(screen|front|glass|lcd)(?:(?!\bnot\b).)*(not)?.*?(replaced|cracked|broken|chipped)

(?:(?!\bnot\b).)*将检查要匹配的字符是否是字符串not中的起始字母。如果是,那么它将匹配以下字符。否则,它将不匹配以下字符,从而导致空匹配(因为*)。

演示

票数 3
EN

Stack Overflow用户

发布于 2015-03-22 05:01:06

你忘了“是”这个词

代码语言:javascript
运行
AI代码解释
复制
m!\b(screen|front|glass|lcd)\b *is *\b(not\b)?(replaced|cracked|broken|chipped)\b!i
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29194583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档