使用正则表达式在部分内的组件中搜索数字

时间:2018-09-11 23:06:33

标签: java regex

给出以下字符串:

G1:NMXPAKW63roBnMZ[RQ:1,2]-G2:Q9M7mPl9X4NG9Ry[QC:1,5]-G3:1Bd57mPl9X4NG9Ry[QC:1,5]

我有以下正则表达式(其基础来自上一个问题):

 G2:(?:(?!-G)\S)*([^0-9]|^)1([^0-9]|$)

我要实现的目标是“使节开始于G2,结束于下一节之前”,在这种情况下为-G3,然后“搜索第一位”。

这有效,但是我想在它遇到QC时停止搜索:部分,当前,如果我用9替换正则表达式中的1,它将与哈希组件(Q9M7mPl9X4NG9Ry)中的9匹配,我不这样做想。在G2部分中,我只想在QC:1,5组件中查找匹配项。

2 个答案:

答案 0 :(得分:1)

正则表达式-G2:.*?\[(.*?)\]将为您提供QC:1,5部分

Demo

答案 1 :(得分:1)

以下正则表达式将起作用:(?:^|-)G2:(?:(?!-G).)*QC:(?:(?!-G).)*(?<!\d)(\d+)

它的工作原理如下:

  • 找到G2部分:(?:^|-)G2:
    这可以是第一部分(输入以G2开头),也可以是第二部分(匹配-G2)。

  • 跳过随机文本,但在下一部分停止:(?:(?!-G).)*
    这基本上是.*,但如果.-中的-G相匹配,则负向前进​​将停止。

  • 找到QC:QC:

  • 跳过随机文本,但在下一节停止:(?:(?!-G).)*

  • 匹配一个整数并捕获它:(?<!\d)(\d+)

第二个“跳过文本”将定位到该节的末尾,然后从该处回溯直到找到一个数字。

由于我们正在回溯,所以我们需要在(?<!\d)之后使用负向后看,以确保回溯不会在数字中间停止。

请参见demo on regex101.com