我对正则表达式很陌生,但我做了一些研究。 我遇到了一个可能无法通过正则表达式解决的问题,因此我需要一些建议。
我有以下字符串:
some text key 12, 32, 311 ,465 and 345. some other text dog 612,
12, 32, 9 and 10. some text key 1, 2.
我正在尝试计算是否有可能(仅使用正则表达式)提取数字 12
32
311
465
345
1
2
仅 - 作为一组单独的匹配项。
当我处理这个问题时,我试图寻找一种只匹配相关结果的模式。 所以我想出了:
- 获取前缀为“key”但没有前缀“dog”的数字。
但我不确定这是否可能。我的意思是我知道号码 1
我可以使用 (?<=key )+[\d]+
结果得到它,但是对于其余数字(即 2..5
),我可以“使用” key
吗?又是前缀?
最佳答案
在 Java 中,您可以使用接受 {n,m}
限制量词的受限宽度后视。
所以,你可以使用
(?<=key(?:(?!dog)[^.]){0,100})[0-9]+
或者,如果 key
和 dog
是整个单词,则使用 \b
单词边界:
String pattern = "(?<=\\bkey\\b(?:(?!\\bdog\\b)[^.]){0,100})[0-9]+";
如果 dog
或 key
与数字之间的距离大于 m
,可能会出现唯一的问题。您可以将其增加到 1000,我认为这适用于大多数情况。
样本 IDEONE demo
String str = "some text key 12, 32, 311 ,465 and 345. some other text dog 612,\n12, 32, 9 and 10. some text key 1, 2.";
String str2 = "some text key 1, 2, 3 ,4 and 5. some other text dog 6, 7, 8, 9 and 10. some text, key 1, 2 dog 3, 4 key 5, 6";
Pattern ptrn = Pattern.compile("(?<=key(?:(?!dog)[^.]){0,100})[0-9]+");
Matcher m = ptrn.matcher(str);
while (m.find()) {
System.out.println(m.group(0));
}
System.out.println("-----");
m = ptrn.matcher(str2);
while (m.find()) {
System.out.println(m.group(0));
}
关于java - 使用相同的字符串部分进行正则表达式检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31579781/