regex - 正则表达式仅在单词不跟随另一个单词时才匹配单词
问题描述
使用正则表达式,只有当它不跟随另一个单词时,我如何才能匹配一个单词?
例如
,如果单词“cat”之前没有出现,我想匹配单词“dog”
the fox jumps over the dog
- 匹配
a cat cannot jump over a big dog
- 不匹配
Hello dog, I'm cat
- 匹配
Hello cat, I'm dog
- 不匹配
我尝试了以下方法:
(?<!cat.*)dog
但是,否定后视内的量词不起作用。
对此的解决方案将不胜感激!
解决方案
在支持Atomic Group、Conditionals和\K的 PCRE 中,下面的正则表达式可以帮助匹配。
图案: (?>^.*?\K(?:cat|(dog)))(?(1)|$.^)
分解:
(?>^.*?\K(?:cat|(dog)))
(?:cat|(dog))
: 匹配猫或狗。cat
被优先考虑。如果dog
匹配,则将其捕获在group 1
.^.*?\K(?:cat|(dog))
: 懒惰地匹配从^
tillcat
或 a 的所有内容dog
。用于\K
丢弃此处匹配的字符串。(?>^.*?\K(?:cat|(dog)))
: 将其包含在原子组中,(?>)
,因此可以防止回溯。因此,如果 cat 在字符串中首先匹配,引擎将不会回溯到匹配 dog。
(?(1)|$.^)
: 如果组 1 匹配,则分支为空,所以匹配成功,否则尝试匹配不可能的模式$.^
演示: https ://regex101.com/r/omsG46/1/
谢谢
推荐阅读
- php - 检测数组是否包含另一个数组
- coq - 矛盾陈述的使用
- java - 当两个文件都在同一个文件夹中时,为什么 relativize 会产生“../file_name”?
- apache - .htaccess 内部路径重写的最佳实践?
- css - 伪元素在 chrome 手机上消失,在桌面上运行良好
- c - 如何将文本文件与单词列表进行比较,无论哪个单词不在列表中,我都必须在第三个文件中写下(在 C 中)
- flutter - 针对 Google Ads 的严格安全 Cookie 政策
- java - 如何从控制器中的 Principal 获取数据?
- android - android:如果存在则跳过 ACTION_CREATE_DOCUMENT
- qml - 将 GridLayout 与 QAbstractModelList 和中继器一起使用