正则表达式匹配不是特定子字符串的东西

我正在寻找一个正则表达式,它将匹配以一个子字符串开头并且不以特定子字符串结尾的字符串。

例:

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

应匹配任何以“foo”开头并且不以“bar”结尾的内容。 我知道[^ ...]语法,但是我找不到任何能够为字符串而不是单个字符做的事情。

我专门为Java的正则表达式做这件事,但我已经遇到过,所以其他正则表达式引擎的答案也会很好。

感谢@Kibbee验证这是否也适用于C#。


我认为在这种情况下,你想要消极的后顾之忧 ,就像这样:

foo.*(?<!bar)

已验证@ Apocalisp的回答使用:

import java.util.regex.Pattern;
public class Test {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("^foo.*(?<!bar)$");
    System.out.println(p.matcher("foobar").matches());
    System.out.println(p.matcher("fooBLAHbar").matches());
    System.out.println(p.matcher("1foo").matches());
    System.out.println(p.matcher("fooBLAH-ar").matches());
    System.out.println(p.matcher("foo").matches());
    System.out.println(p.matcher("foobaz").matches());
  }
}

这个输出是正确的答案:

false
false
false
true
true
true

我对Java正则表达式不熟悉,但Pattern Class的文档建议您可以使用(?!X)作为非捕获零宽度负向预测(它在该事件中寻找不是X的东西,而不捕获它作为反向引用)。 所以你可以这样做:

foo.*(?!bar) // not correct

更新 :Apocalisp的权利,你想负反面。 (你正在检查。*匹配不会以bar结尾)

链接地址: http://www.djcxy.com/p/77015.html

上一篇: Regex to match against something that is not a specific substring

下一篇: Match any sequence which repeats itself n times