正则表达式,用于匹配不是特定子字符串的内容

2022-09-03 07:38:32

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

例:

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

应该匹配任何以“foo”开头且不以“bar”结尾的内容。我知道[^...]语法,但我找不到任何可以对字符串而不是单个字符执行此操作的东西。

我特别尝试为Java的正则表达式执行此操作,但是我以前遇到过这种情况,因此其他正则表达式引擎的答案也很棒。

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


答案 1

我认为在这种情况下,你想要负面的外观,就像这样:

foo.*(?<!bar)

答案 2

使用以下命令验证@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