如何在正则表达式中匹配多个单词

Posted

技术标签:

【中文标题】如何在正则表达式中匹配多个单词【英文标题】:How to match multiple words in regex 【发布时间】:2011-07-22 06:32:43 【问题描述】:

只是一个简单的正则表达式,我不知道怎么写。

正则表达式必须确保字符串匹配所有 3 个单词。我知道如何使它匹配 3 个中的 任何

/advancedbrain|com_ixxocart|p\=completed/

但我需要确保 所有 3 个单词都出现在字符串中。

这里是单词

    高级大脑 com_ixxocart p=完成

【问题讨论】:

因此,作为示例字符串,您有 'blah blah sample text advancebrain where #com_ixxocart blah blahp=completedstuff' ? 我个人会用 3 个正则表达式来做到这一点;它可能只是一个很丑陋,而且可能更慢。 这些来自查询字符串吗?如果是这样,您可能不需要使用任何正则表达式 我必须将它插入到谷歌分析给我的一个输入中。所以,我只能使用一个正则表达式。 【参考方案1】:
^(?=.*?p=completed)(?=.*?advancebrain)(?=.*?com_ixxocart).*$

花费了太长时间的测试和改进 =/ 哦,好吧.. 仍然会发布我的答案

【讨论】:

【参考方案2】:

使用前瞻:

(?=.*\badvancebrain)(?=.*\bcom_ixxocart)(?=.*\bp=completed)

顺序无关紧要。这三个都是必需的。

【讨论】:

最好在开始时锚定正则表达式,否则如果不是所有三个都存在,您将获得可怕的性能。【参考方案3】:

使用lookahead assertions:

^(?=.*advancebrain)(?=.*com_ixxochart)(?=.*p=completed)

如果所有三个词都存在则匹配。

如果需要避免这种情况,您可能需要在搜索词周围添加 \b 工作边界,以确保它们匹配为完整的词而不是其他词的子字符串(如 advancebraindeath):

^(?=.*\badvancebrain\b)(?=.*\bcom_ixxochart\b)(?=.*\bp=completed\b)

【讨论】:

我只得到了一个输入字段来放入这个正则表达式,它用于谷歌分析。他们展示了一个简单的 /yourregex/ 示例。你猜先行会起作用吗?我不知道他们将使用什么编程语言来运行正则表达式。 看起来 GA (Google Analytics) 支持前瞻。 lunametrics.com/blog/2007/08/08/… 对于像 go 这样不支持前瞻的语言有解决方法吗? @klew:您需要对所有可能的排列进行硬编码,因此对于检查 abc 是否以任何顺序出现的正则表达式,您需要搜索a.*b.*c|a.*c.*b|b.*a.*c|b.*c.*a|c.*a.*b|c.*b.*a 这当然容易出错并且扩展性极差,因此最好执行三个单独的正则表达式调用,每个条件一个,并确保所有三个匹配。

以上是关于如何在正则表达式中匹配多个单词的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式,将字符串中的每个单词首字母大写

正则表达式:\B 匹配不是单词开头或结束的位置

使用正则表达式匹配多个逗号分隔的单词

pyspark字符串匹配多个精确单词正则表达式的有效方法

Java如何在正则表达式中匹配重复单词?

Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词