我想匹配以 结尾的字符串,bar例如:foobar或bar. 这样的正则表达式可能是:/^.*bar$/.
我还想排除带有u前缀的字母的字符串bar,例如,这些字符串不应该与正则表达式匹配:ubar或fooubar。我试过/^.*[^u]?bar$/了,但它不起作用。我们怎么能解决这个问题?
只需将整个前缀括在括号中
^(.*[^u])?bar$
通过这样做,如果之前至少有一个非u字符,则您只允许更前面的字符bar。
或者,如果您的正则表达式引擎支持负后瞻,您可以这样做:
^.*(?<!u)bar$
当此正则表达式到达该位置之前bar,它会查看其左侧的字符并尝试匹配u. 如果这不可能,比赛将继续进行。如果u找到了,则向后查找将使模式失败。如果有非u字符并且它是字符串的开头,这两种方法都有效。
^.*正如sawa在评论中指出的那样,如果您只想检查字符串是否以 结尾,您甚至不需要bar:
(?<!u)bar$
当然,如果您出于某种原因(使用多行模式替换或匹配行)想要在匹配中包含整个字符串,那么这^.*是必要的。请注意,在第一个正则表达式中,您不能将其排除在外。但是,您可以将其更改为
([^u]|^)bar$
这也将避免匹配整个字符串。
?将in之前的所有内容分组()。这具有说“前面的整个可选结构bar,如果存在,不得以u”结尾的效果。
例如在 JavaScript 中:
/^(.*[^u])?bar$/.test("foobar");
// true
/^(.*[^u])?bar$/.test("fooubar");
// false
/^(.*[^u])?bar$/.test("bar");
// true
/^(.*[^u])?bar$/.test("ubar");
// false
使用后视:
def match_bar? string
string =~ /(?<!u)bar\z/
end
%w{foobar ubar fooubar}.each do |example|
puts "#{example} does #{match_bar?(example) ? '' : 'not'} match the regex."
end
输出:
foobar does match the regex.
ubar does not match the regex.
fooubar does not match the regex.