【问题标题】:Regex match anything but a specific pattern [duplicate]正则表达式匹配除特定模式以外的任何内容[重复]
【发布时间】:2017-11-04 21:32:30
【问题描述】:

我需要一个正则表达式,它匹配除模式 \d+-\d+ 以外的任何内容

要忽略的模式是一个或多个数字后跟连字符的数字,然后是另一个具有一个或多个数字的数字。

例如:

测试 123 测试 123-123 测试

只有“123-123”不应该匹配

谁能帮我实现这个目标?

【问题讨论】:

  • 你可以使用\\d+(?!-\\d+)
  • 你希望用户限制 - 输入吗?
  • s.split("\\d+-\\d+")
  • 你为什么不使用"Test 123 Test 123-123 Test".replaceAll("\\d+-\\d+", "")

标签: java android regex match regex-lookarounds


【解决方案1】:

您没有指定是要匹配单个字符串的表达式(Pattern#matches(String, CharSequence)String#matches(String))还是要在一个字符串中查找多个匹配项(Matcher#find())。

匹配单个字符串

如果inputTest123 会采用以下分支,但如果是 123-123 则不会:

if (input.matches("(?s)(?!\\d+-\\d+).*")) {
    // ...
}

虽然,如果您的代码进行了实际的matches 调用,您不妨这样写:

if (!input.matches("\\d+-\\d+")) {
    // ...
}

在字符串中查找匹配项

如果您想在一个字符串中找到多个匹配项,很大程度上取决于您要如何标记。下面的示例代码列出了所有格式为\d+-\d+的空格分隔序列:

Pattern pattern = Pattern.compile("(?<=^|\\s)(?!\\d+-\\d+)\\S+(?=$|\\s)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
    System.out.println(matcher.group());
}

对于“Test 123 Test 123-123 Test”的输入,输出将是:

Test
123
Test
Test

如果您想以不同的方式进行标记,则必须调整边界匹配。 Java 的正则表达式有一个单词边界匹配器 (\b),但 123-123 不会被视为一个单词,因为它包含一个连字符,它不是正则表达式单词字符。

【讨论】:

  • 我需要在一个字符串中找到这个模式。所以你回答的第二部分解决了我的问题。非常感谢!
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多