java - 使用相同的字符串部分进行正则表达式检查

标签 java regex string

我对正则表达式很陌生,但我做了一些研究。 我遇到了一个可能无法通过正则表达式解决的问题,因此我需要一些建议。

我有以下字符串:

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]+

或者,如果 keydog 是整个单词,则使用 \b 单词边界:

String pattern = "(?<=\\bkey\\b(?:(?!\\bdog\\b)[^.]){0,100})[0-9]+";

如果 dogkey 与数字之间的距离大于 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/

相关文章:

java - 更改java中数组的偏移量

regex - 匹配除一个以外的所有单词

ruby - 匹配字符串中孤立的 % 所需的正则表达式

Ruby:删除小数点后(包括)小数点后的所有内容

java - Android 中的字符串和 EditText 函数问题

java - Java 中字符串连接时为 "=="

java - 继承: Annotate @Id of Super class to child class having different sequences

java - Java中获取数字签名的私钥

java - "XX"已定义

java - 需要正则表达式帮助