【发布时间】:2018-08-29 09:51:17
【问题描述】:
给定以下字符串(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 部分相关联。
当前正则表达式的问题在于它搜索得太远,最终在案例 1 中到达 RQ:3,4,即使我不想考虑超过 G2 部分。
stringToTest 也可能是(只有一个部分):
G2:7JAPjGdnGy8jxR8[RQ:3,4]
字符串7JAPjGdnGy8jxR8 和jRo6pN8ZW9aglYz 是可变长度哈希。
任何人都可以帮助我使用正确的正则表达式,开始查看 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下面的一些解释和上面的解决方案。