我试图将下面的字符串分成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
答案 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组相同的模式。