Java正则表达式模式组捕获

时间:2016-10-14 12:38:04

标签: java regex

我试图将下面的字符串分成3组,但是它似乎并没有像我预期的那样使用我正在使用的模式。也就是说,当我调用matcher.group(3)时,我得到一个空值而不是*;+g.3gpp.cs-voice;require。模式有什么问题?

字符串:"*;+g.oma.sip-im;explicit,*;+g.3gpp.cs-voice;require"

模式:(\\*;.*)?(\\*;.*?\\+g.oma.sip-im.*?)(,\\*;.*)?

预期:

第1组:null, 第2组:*;+g.oma.sip-im;explicit, 第3组:,*;+g.3gpp.cs-voice;require

实际值:

第1组:null, 第2组:*;+g.oma.sip-im, 第3组:null

2 个答案:

答案 0 :(得分:0)

你得到的结果实际上是以非贪婪的方式匹配你的模式。 Group2扩展到尽可能短的结果

*;+g.oma.sip-im

然后由于最后的问号而忽略了最后一组。在我看来,你正在为你的目的建立一个太复杂的正则表达式。

答案 1 :(得分:0)

问题是(,\*;.*)?不匹配,因为您期望的文本位于字符串中。您需要通过删除最后的?来使第三组必须,但将整个.*? + Group 3包装在可选的非捕获组中:

String pat = "(\\*;.*)?(\\*;.*?\\+g\\.oma\\.sip-im)(?:.*?(,\\*;.*))?";

请参阅regex demo

请注意,文字点应以正则表达式模式进行转义。

<强>详情:

  • (\\*;.*)? - 第1组(可选)捕获
    • \\*; - *;字符串
    • .* - 除了换行符号之外的任何零个或多个字符,尽可能多
  • (\\*;.*?\\+g\\.oma\\.sip-im) - 第2组(强制性)捕获
    • \\*; - *;字符串
    • .*? - 除了换行符号之外的任何零个或多个字符,尽可能少
    • \\+g\\.oma\\.sip-im - 文字字符串+g.oma.sip-im
  • (?:.*?(,\\*;.*))? - 非捕获组(可选)匹配
    • .*? - 除了换行符号之外的任何零个或多个字符,尽可能少
    • (,\\*;.*) - 第3组(强制性)捕获与第1组相同的模式。