正则表达式匹配除特定模式之外的任何内容

Regex match anything but a specific pattern

我需要一个正则表达式,匹配除模式 \d+-\d+

之外的任何内容

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

例如:

测试123测试 123-123 测试

只有“123-123”不应匹配

谁能帮我实现这个目标?

您没有指定您是否需要一个表达式来匹配单个字符串(Pattern#matches(String, CharSequence)String#matches(String)),或者您是否想在一个字符串中查找多个匹配项(Matcher#find()) .

匹配单个字符串

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

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

尽管如此,如果您的代码进行了实际的 matches 调用,您也可以这样写:

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

在字符串中查找匹配项

如果您想在一个字符串中找到多个匹配项,很大程度上取决于您要如何标记化。下面的示例代码列出了所有 not 形式 \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 不会被认为是一个单词,因为它包含一个连字符,这不是正则表达式字符。