正则表达式匹配非特定子字符串的内容

发布于 2024-07-05 08:09:53 字数 331 浏览 6 评论 0原文

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

示例:

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

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

我专门尝试为 Java 的正则表达式执行此操作,但我之前遇到过此问题,因此其他正则表达式引擎的答案也很棒。

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

I am looking for a regex that will match a string that starts with one substring and does not end with a certain substring.

Example:

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

Should match anything that starts with "foo" and doesn't end with "bar". I know about the [^...] syntax, but I can't find anything that will do that for a string instead of single characters.

I am specifically trying to do this for Java's regex, but I've run into this before so answers for other regex engines would be great too.

Thanks to @Kibbee for verifying that this works in C# as well.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我认为在这种情况下你需要负面回顾,如下所示:

foo.*(?<!bar)

I think in this case you want negative lookbehind, like so:

foo.*(?<!bar)
冰葑 2024-07-12 08:09:53

使用验证@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

Verified @Apocalisp's answer using:

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());
  }
}

This output the the right answers:

false
false
false
true
true
true
微暖i 2024-07-12 08:09:53

我不熟悉 Java 正则表达式,但不熟悉 模式类建议您可以使用 (?!X) 进行非捕获零宽度负向前查找(它在该位置查找不是 X 的东西,而不将其捕获为反向引用)。 所以你可以这样做:

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

更新:Apocalisp 是对的,你想要负面的lookbehind。 (您正在检查 .* 匹配的内容是否不以 bar 结尾)

I'm not familiar with Java regex but documentation for the Pattern Class would suggest you could use (?!X) for a non-capturing zero-width negative lookahead (it looks for something that is not X at that postision, without capturing it as a backreference). So you could do:

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

Update: Apocalisp's right, you want negative lookbehind. (you're checking that what the .* matches doesn't end with bar)

呆头 2024-07-12 08:09:53

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

"^first_string(?!.?second_string)\\z"
  • ^ - 确保字符串以以下形式开头
    first_string
  • \z - 确保字符串以 Second_string 结尾
  • (?!.?second_string) - 意味着first_string 后面不能跟第二个_string

As other commenters said, you need a negative lookahead. In Java you can use this pattern:

"^first_string(?!.?second_string)\\z"
  • ^ - ensures that string starts with
    first_string
  • \z - ensures that string ends with second_string
  • (?!.?second_string) - means that first_string can't be followed by second_string
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文