字符串之间的Java模式正则表达式搜索

字符串之间的Java模式正则表达式搜索,java,regex,Java,Regex,给定以下字符串(stringToTest): G2:7japkgdngy8jxr8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4] 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,我不想匹配,

给定以下字符串(stringToTest):

  • G2:7japkgdngy8jxr8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4]
  • 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部分相关联

    <当前的正则表达式的问题是它搜索得太远,最终达到了<代码> RQ:3,4/COD>最终在1的情况下,即使我不想考虑过去的G2部分。< /P> stringToTest也可能是(仅一个部分):

    字符串
    7JAPjGdnGy8jxR8
    jRo6pN8ZW9aglYz
    是可变长度散列


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

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

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

    正则表达式详细信息:

    • G2:
      :匹配文字
      G2:
    • (?:
      启动非捕获组
      • (?!G\d+:)
        :断言我们前面没有
        G:
      • \S
        :匹配非空白字符
    • )*
      :结束非捕获组。匹配0个或多个此项
    • RQ:3,4
      :匹配文本
      RQ:3,4
    在Java中,使用以下正则表达式:

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

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

    [^[]
    表示除
    [


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

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

    在一般情况下,您可以使用

    String regex = "G2:(?:(?!-G)\\S)*RQ:3,4";
    
    请参阅。
    (?:(?!-G)\S)*
    是一个标记,它将匹配不启动
    -G
    子字符串的0+个非空白字符

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

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

    请参阅。
    [^\\s-]*
    将匹配0个或多个除空格以外的字符,并且
    -

    连字符是否只能在下一节前面使用?如果是,请从
    \s
    中减去
    -
    。在一般情况下,您可以使用
    G2:(?:(?!-G)\s)*RQ:3,4
    ,请参阅。
    (?:(?!-G)\s)*
    是一个标记,它将匹配不以
    -G
    子字符串开头的非空白字符的0+次出现。是的,Wiktor,连字符只能在下一节前面出现。请参阅下面的一些解释和上面的解决方案。干杯,这是我最后使用的解决方案。
    String regex = "G2:[^\\s-]*RQ:3,4"; // using a negated character class
    String regex = "G2:[\\S&&[^-]]*RQ:3,4"; // using character class subtraction