有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

字符串之间的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,我希望字符串2匹配,因为RQ:3,4与G2部分相关联

<当前的正则表达式的问题是它搜索得太远,最终在1的情况下到达^ {CD3>},即使我不想考虑过去的G2部分。

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

G2:7JAPjGdnGy8jxR8[RQ:3,4]

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

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


共 (3) 个答案

  1. # 1 楼答案

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

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

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

    regex demo(?:(?!-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
    

    this regex demo[^\\s-]*将匹配0个或更多字符,而不是空格和-

  2. # 2 楼答案

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

    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";
    
  3. # 3 楼答案

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

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

    Demo

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