3

我想匹配以 结尾的字符串,bar例如:foobarbar. 这样的正则表达式可能是:/^.*bar$/.

我还想排除带有u前缀的字母的字符串bar,例如,这些字符串不应该与正则表达式匹配:ubarfooubar。我试过/^.*[^u]?bar$/了,但它不起作用。我们怎么能解决这个问题?

4

3 回答 3

4

只需将整个前缀括在括号中

^(.*[^u])?bar$

通过这样做,如果之前至少有一个非u字符,则您只允许更前面的字符bar

或者,如果您的正则表达式引擎支持负后瞻,您可以这样做:

^.*(?<!u)bar$

当此正则表达式到达该位置之前bar,它会查看其左侧的字符并尝试匹配u. 如果这不可能,比赛将继续进行。如果u找到了,则向后查找将使模式失败。如果有非u字符并且它是字符串的开头,这两种方法都有效。

^.*正如sawa在评论中指出的那样,如果您只想检查字符串是否以 结尾,您甚至不需要bar

(?<!u)bar$

当然,如果您出于某种原因(使用多行模式替换或匹配行)想要在匹配中包含整个字符串,那么这^.*是必要的。请注意,在第一个正则表达式中,您不能将其排除在外。但是,您可以将其更改为

([^u]|^)bar$

这也将避免匹配整个字符串。

于 2012-11-16T17:22:19.983 回答
1

?将in之前的所有内容分组()。这具有说“前面的整个可选结构bar,如果存在,不得以u结尾的效果。

例如在 JavaScript 中:

/^(.*[^u])?bar$/.test("foobar");
// true

/^(.*[^u])?bar$/.test("fooubar");
// false

/^(.*[^u])?bar$/.test("bar");
// true

/^(.*[^u])?bar$/.test("ubar");
// false
于 2012-11-16T17:21:51.127 回答
1

使用后视:

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.
于 2012-11-16T17:39:34.020 回答