【发布时间】:2022-12-23 02:41:45
【问题描述】:
使用 Java 中的正则表达式,我想编写一个正则表达式,当且仅当模式前面没有某些字符时才会匹配。例如:
String s = "foobar barbar beachbar crowbar bar ";
如果 bar 前面没有 foo,我想匹配。所以输出将是:
barbar
beachbar
crowbar
bar
【问题讨论】:
使用 Java 中的正则表达式,我想编写一个正则表达式,当且仅当模式前面没有某些字符时才会匹配。例如:
String s = "foobar barbar beachbar crowbar bar ";
如果 bar 前面没有 foo,我想匹配。所以输出将是:
barbar
beachbar
crowbar
bar
【问题讨论】:
你想像这样使用negative lookbehind:
w*(?<!foo)bar
(?<!x) 的意思是“只有在这一点之前没有“x””。
有关详细信息,请参阅Regular Expressions - Lookaround。
编辑: 添加 w* 以捕获之前的字符(例如“海滩”)。
【讨论】:
(?<!foo).*bar 会匹配类似的东西,我相信。
(?!foo)w*bar。
另一种选择是首先匹配可选的单词字符,然后匹配bar,匹配后检查直接在左边的不是foobar。
lookbehind 断言将在首先匹配bar 后运行。
w*bar(?<!foobar)
w*匹配0+个单词字符bar字面匹配(?<!foobar) Negative lookbehind,从当前位置断言foobar 不是直接在左边。
【讨论】:
在某些情况下,可以更容易地选择性地包含前面的部分,然后在第二步中跳过这些匹配项。例如,要查找不以“+”开头的数字:
if (preg_match_all('/(+?[0-9][0-9s-].*[0-9])/s',$text,$matches)) {
foreach($matches[1] as $match) {
if(substr($match,0,1) == '+'){
continue;
}
// continue processing
}
}
后面的负向查找不起作用,因为它仍然会匹配 2+ 个数字,但它不会包括匹配中的第一个数字。例如 +1234 将返回为 234。
【讨论】: