我需要一个正则表达式,除了模式 \ d + - \ d + +
之外的所有内容都匹配要忽略的模式是一个数字,其中一个或多个数字后跟一个连字符,然后是另一个带有一个或多个数字的数字。
例如:
测试123测试 123-123 测试
仅“123-123”不匹配
任何人都可以帮我实现这个目标吗?
答案 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 不会被认为是一个单词,因为它包含一个连字符,而不是一个正则表达式字符。