我正在寻找一个匹配字符串的正则表达式,该字符串以一个子字符串开头,并且不以某个子字符串结尾 .
例:
// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$
应匹配任何以“foo”开头并且不以“bar”结尾的内容 . 我知道[^...]语法,但我找不到任何能为字符串而不是单个字符做的事情 .
我特意尝试为Java的正则表达式做这个,但我已经遇到过这个问题,所以其他正则表达式引擎的答案也会很棒 .
感谢@Kibbee验证这也适用于C# .
4 回答
我不熟悉Java正则表达式但是Pattern Class的文档会建议你可以使用(?!X)非捕获零宽度负向前瞻(它在那个帖子中查找不是X的东西,而不是将其捕获为反向引用) . 所以你可以这样做:
Update :Apocalisp 's right, you want negative lookbehind. (you'重新检查 . *匹配的内容不以条形结尾)
正如其他评论者所说,你需要一个负面的前瞻 . 在Java中,您可以使用以下模式:
^ - 确保字符串以first_string开头
\ z - 确保字符串以second_string结尾
(?! . ?second_string) - 表示first_string后面跟不上second_string
我认为在这种情况下你想要 negative lookbehind ,就像这样:
已验证@ Apocalisp的答案:
这输出正确的答案: