字符串之间的Java模式正则表达式搜索
给定以下字符串(stringToTest):字符串之间的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,我不想匹配,
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
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