【问题标题】:Java Pattern regex search between strings字符串之间的 Java 模式正则表达式搜索
【发布时间】:2018-08-29 09:51:17
【问题描述】:

给定以下字符串(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,我希望字符串 2 匹配,因为 RQ:3,4 与 G2 部分相关联。

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

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

G2:7JAPjGdnGy8jxR8[RQ:3,4]

字符串7JAPjGdnGy8jxR8jRo6pN8ZW9aglYz 是可变长度哈希。

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

【问题讨论】:

  • 连字符只能在下一节前面吗?如果是,则从\S 中减去-G2:[^\s-]*RQ:3,4。一般情况下,您可以使用G2:(?:(?!-G)\S)*RQ:3,4,参见regex demo(?:(?!-G)\S)* 是一个缓和的贪婪令牌,它将匹配 0+ 个不以 -G 子字符串开头的非空白字符。
  • 是的,Wiktor,连字符只能出现在下一节的前面。
  • my answer下面的一些解释和上面的解决方案。

标签: java regex


【解决方案1】:

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

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

RegEx Demo

正则表达式详细信息:

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

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

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

【讨论】:

  • 干杯,这是我最后使用的解决方案。
【解决方案2】:

问题是\S 匹配任何空白字符并且正则表达式引擎从左到右解析文本。一旦找到G2:,它就会抓取右侧的所有非空格(因为\S* 是一个模糊的子模式),然后回溯以找到最右边的RQ:3,4

一般情况下,你可以使用

String regex = "G2:(?:(?!-G)\\S)*RQ:3,4";

请参阅regex demo(?:(?!-G)\S)* 是一个缓和的贪婪令牌,它将匹配 0+ 个不以 -G 子字符串开头的非空白字符。

如果连字符只能出现在下一节前面,您可以从\S 中减去-

String regex = "G2:[^\\s-]*RQ:3,4"; // using a negated character class
String regex = "G2:[\\S&&[^-]]*RQ:3,4"; // using character class subtraction

this regex demo[^\\s-]* 将匹配除空格和 - 之外的 0 个或多个字符。

【讨论】:

    【解决方案3】:

    尝试在此正则表达式中使用[^[] 而不是\SG2:[^[]*\[RQ:3,4

    [^[] 表示除[ 之外的任何字符

    Demo

    (考虑到这样的字符串:G2:7JAP[jGd]nGy8[]R8[RQ:3,4] 是不可能的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多