如果字符串中的多个选项中只有一个匹配项,则正则表达式匹配

标签 regex pcre

是否有一种模式可以从字符串中的多个选项中查找是否只有一个匹配项?

假设我们有以下潜在匹配列表:

`foo|bar|baz`

我们有字符串:

`Foo bar, Cambaz!` // shoud not match due to multiple findings
`My bar, good!` // shoud match for `bar`
`My friend, Cambaz!` // shoud match for baz

不区分大小写。

最佳答案

使用

(?i)^(?:(?!foo|bar|baz).)*\K(?:foo|bar|baz)(?!.*(?:foo|bar|baz))

proof .

匹配一些与第一个匹配项(^(?:(?!foo|bar|baz).)*)之前不匹配的任何备选文本,省略匹配的文本(\K),匹配列表中的单词((?:foo|bar|baz)),然后检查那里文本后面的列表中没有任何单词 ( (?!.*(?:foo|bar|baz)) )。

(?i) - 不区分大小写。

带子程序的简化版:

(?i)^(?:(?!(foo|bar|baz)).)*\K\g<1>(?!.*\g<1>)

another proof

\g<1>代表 (foo|bar|baz)模式。

关于如果字符串中的多个选项中只有一个匹配项,则正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62415551/

相关文章:

php - 递归正则表达式中的 If-else 未按预期工作

c# - 字符串中数字的正则表达式

php - 从正则表达式 PHP 中排除符号

c++ - 库包 pcre-8.37 中的文件 pcre.h 在哪里

javascript - 正则表达式中字符类中的小数转义

regex - 再次匹配组,无需再次粘贴(例如ABA)

regex - perl正则表达式匹配元音和辅音

regex - 常规列表indexOf

java - 复杂密码的正则表达式

php - preg 匹配标签之间的文本,排除之间的相同标签