我有不可预测的格式化句子:
Parameters: 123? ,345 abc#8678Alfa 666
我需要正则表达式匹配所有数字,除了用 Alfa 结尾。看似简单,但......
这是我的尝试:
([0-9]+)(?!Alfa)
这是正则表达式的结果:
123 345 867 666
867 是我不想要的结果。
你能给我一个提示吗?
答案 0 :(得分:2)
以下正则表达式适用于您的案例
"(?![0-9]+Alfa)[0-9]+"
String input = "Parameters: 123? ,345 abc#8678Alfa 666";
String patternString = "(?![0-9]+Alfa)[0-9]+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group());
}
// Output will be 123 345 666
?!
被称为负前瞻,用于忽略指定模式后的字符串。有关详情,请访问here
希望这有帮助。
答案 1 :(得分:1)
占有量词可以解决问题:([0-9]++)(?!Alfa)
(使用perl:m/([0-9]++)(?!Alfa)/g
进行测试)。
答案 2 :(得分:1)
对于你的负面预测,你需要锚定你的比赛结束。
使用占有++
代替+
将取消回溯,因此它会自动锚定到匹配的结尾。 (效率最高,但通常不可用)
没有占有欲,使用(?!Alfa|[0-9])
将确保您的匹配不会在阿尔法或数字中间结束。您还可以使用(?=[^0-9]|$)
检查您的匹配是否未在数字中间结束。