java - 字符串之间的 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,我希望字符串 2RQ:3,4
与 G2 部分相关联。
当前正则表达式的问题在于它搜索得太远并RQ:3,4
最终到达案例 1,即使我不想考虑 G2 部分。
stringToTest 也可能是(只有一个部分):
G2:7JAPjGdnGy8jxR8[RQ:3,4]
字符串7JAPjGdnGy8jxR8
和jRo6pN8ZW9aglYz
是可变长度的散列。
任何人都可以帮助我使用正确的正则表达式,开始查看 G2 ,RQ:3,4
但如果它到达字符串的末尾或 -G (下一节的开头)则停止。
解决方案
您可以使用此正则表达式并在两者之间使用负前瞻:
G2:(?:(?!G\d+:)\S)*RQ:3,4
正则表达式详细信息:
G2:
: 匹配文字G2:
(?:
启动非捕获组(?!G\d+:)
: 断言我们G<digit>:
前面没有\S
: 匹配一个非空白字符
)*
:结束非捕获组。匹配 0 条或更多条RQ:3,4
: 匹配文字RQ:3,4
在 Java 中使用这个正则表达式:
String re = "G2:(?:(?!G\\d+:)\\S)*RQ:3,4";
推荐阅读
- racket - 尝试编写一个函数,以球拍语言返回列表中的每三个元素
- amazon-s3 - 使用 rusoto 将字符串上传到 S3
- node.js - Dialogflow Node.js 没有获取 app.inent 中 https.get 的值
- javascript - RegEx 从多行字符串中捕获子字符串并将它们转换为对象数据结构
- python - 如何使用 Visual Studio Code 在 Python 中将文件读取为相对路径?
- ios - 在swift 4中为相关注释添加标题和副标题
- apache-spark - 从 Apache Spark 将数据上传到 HBase 的正确方法是什么?
- python-3.x - 多重继承:接受 0 个位置参数,但给出了 1 个
- python - setuptools.setup 对所有元数据关键字有什么作用?
- reactjs - 如何保存以前的道具以在 componentDidUpdate() 中使用?