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

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

例:

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

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

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

感谢@Kibbeevalidation这也适用于C#。

我想在这种情况下你想要负面的背后照 ,就像这样:

 foo.*(? 

已validation@ Apocalisp的答案:

 import java.util.regex.Pattern; public class Test { public static void main(String[] args) { Pattern p = Pattern.compile("^foo.*(? 

这输出正确的答案:

 false false false true true true 

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

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

更新 :Apocalisp是对的,你想要负面的背后。 (你正在检查。*匹配不会以条形结尾)

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

 "^first_string(?!.?second_string)\\z" 
  • ^ – 确保字符串以first_string开头
  • \ z – 确保字符串以second_string结尾
  • (?!。?second_string) – 意味着first_string不能跟随second_string