我想匹配以 结尾的字符串,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.