字符串之间的Java模式正则表达式搜索
给定以下字符串(stringToTest):
G2:7JAPjGdnGy8jxR8[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部分相关联
stringToTest也可能是(仅一个部分):
G2:7JAPjGdnGy8jxR8[RQ:3,4]
字符串7JAPjGdnGy8jxR8
和jRo6pN8ZW9aglYz
是可变长度哈希
有没有人能帮助我使用正确的正则表达式,开始查看G2中的RQ:3,4
,但如果它到达字符串的结尾或-G(下一节的开头),就停止
# 1 楼答案
问题是
\S
匹配任何空格字符,并且正则表达式引擎从左到右解析文本。一旦找到G2:
,它将抓住右边的所有非空白(因为\S*
是一个ghreedy子模式),然后回溯以找到最右边出现的RQ:3,4
在一般情况下,您可以使用
见regex demo
(?:(?!-G)\S)*
是一个贪婪标记,它将匹配不启动-G
子字符串的0+个非空白字符如果连字符只能在下一节前面使用,则可以从
\S
中减去-
:见this regex demo
[^\\s-]*
将匹配0个或更多字符,而不是空格和-
# 2 楼答案
您可以使用此正则表达式并在以下两者之间进行负前瞻:
RegEx Demo
正则表达式详细信息:
G2:
:匹配文本G2:
(?:
启动一个非捕获组(?!G\d+:)
:断言我们前面没有G<digit>:
\S
:匹配非空白字符)*
:结束非捕获组。匹配0个或多个此项RQ:3,4
:匹配文本RQ:3,4
在Java中,使用以下正则表达式:
# 3 楼答案
在这个正则表达式中尝试使用
[^[]
而不是\S
:G2:[^[]*\[RQ:3,4
[^[]
表示除[
以外的任何字符Demo
(考虑到像这样的字符串:
G2:7JAP[jGd]nGy8[]R8[RQ:3,4]
是不可能的)