正则表达式匹配任何特定模式

时间:2017-06-03 16:57:01

标签: java android regex match regex-lookarounds

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

之外的所有内容都匹配

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

例如:

测试123测试 123-123 测试

仅“123-123”不匹配

任何人都可以帮我实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

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

匹配单个字符串

如果input 测试 123 ,则会执行以下分支,但如果 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());
}

对于&#34;测试123测试123-123测试&#34;的输入,输出将是:

Test
123
Test
Test

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