首页 > 解决方案 > 字符串之间的 Java 模式正则表达式搜索

问题描述

给定以下字符串(stringToTest):

  1. G2:7JAPjGdnGy8jxR8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4]
  2. G2:7JAPjGdnGy8jxR8[RQ:3,4]-G3:jRo6pN8ZW9aglYz[RQ:3,4]

和模式:

Pattern p = Pattern.compile("G2:\\S+RQ:3,4");
if (p.matcher(stringToTest).find())
{
    // Match
}

对于字符串 1,我不想匹配,因为 RQ:3,4 与 G3 部分相关联,而不是 G2,我希望字符串 2RQ:3,4与 G2 部分相关联。

当前正则表达式的问题在于它搜索得太远并RQ:3,4最终到达案例 1,即使我不想考虑 G2 部分。

stringToTest 也可能是(只有一个部分):

G2:7JAPjGdnGy8jxR8[RQ:3,4]

字符串7JAPjGdnGy8jxR8jRo6pN8ZW9aglYz是可变长度的散列。

任何人都可以帮助我使用正确的正则表达式,开始查看 G2 ,RQ:3,4但如果它到达字符串的末尾或 -G (下一节的开头)则停止。

标签: javaregex

解决方案


您可以使用此正则表达式并在两者之间使用负前瞻:

G2:(?:(?!G\d+:)\S)*RQ:3,4

正则表达式演示

正则表达式详细信息:

  • G2:: 匹配文字G2:
  • (?:启动非捕获组
    • (?!G\d+:): 断言我们G<digit>:前面没有
    • \S: 匹配一个非空白字符
  • )*:结束非捕获组。匹配 0 条或更多条
  • RQ:3,4: 匹配文字RQ:3,4

在 Java 中使用这个正则表达式:

String re = "G2:(?:(?!G\\d+:)\\S)*RQ:3,4";

推荐阅读