首页 文章

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

提问于
浏览
16

我正在寻找一个匹配字符串的正则表达式,该字符串以一个子字符串开头,并且不以某个子字符串结尾 .

例:

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

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

我特意尝试为Java的正则表达式做这个,但我已经遇到过这个问题,所以其他正则表达式引擎的答案也会很棒 .

感谢@Kibbee验证这也适用于C# .

4 回答

  • 9

    我不熟悉Java正则表达式但是Pattern Class的文档会建议你可以使用(?!X)非捕获零宽度负向前瞻(它在那个帖子中查找不是X的东西,而不是将其捕获为反向引用) . 所以你可以这样做:

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

    Update :Apocalisp 's right, you want negative lookbehind. (you'重新检查 . *匹配的内容不以条形结尾)

  • 1

    正如其他评论者所说,你需要一个负面的前瞻 . 在Java中,您可以使用以下模式:

    "^first_string(?!.?second_string)\\z"
    
    • ^ - 确保字符串以first_string开头

    • \ z - 确保字符串以second_string结尾

    • (?! . ?second_string) - 表示first_string后面跟不上second_string

  • 0

    我认为在这种情况下你想要 negative lookbehind ,就像这样:

    foo.*(?<!bar)
    
  • 1

    已验证@ 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
    

相关问题