正则表达式有什么问题?

时间:2018-12-18 22:16:12

标签: java regex

我不明白,为什么此正则表达式无法按我预期的方式工作:

正则表达式:^<prefix>(.*?)(<optTag.*?>)?(.*?)<postfix>$

测试:<prefix>some chars<optTag value>some chars<postfix>

测试结果:

第1组:空

第2组:空

第3组:some chars<optTag value>some chars

我希望第2组= <optTag value>

3 个答案:

答案 0 :(得分:1)

您不能在可选捕获组之前使用非贪婪通配符。改用它:

^<prefix>([^<]*)(<optTag.*?>)?(.*?)<postfix>$

答案 1 :(得分:1)

有点痛苦,但是您可以在这些(.*?)组中添加 block 断言。

^<prefix>((?:(?!<optTag.*?>).)*?)(<optTag.*?>)?((?:(?!<optTag.*?>).)*?)<postfix>$

https://regex101.com/r/6cQlkC/1

扩展

 ^ 
 <prefix>
 (                             # (1 start)
      (?:
           (?! <optTag .*? > )
           . 
      )*?
 )                             # (1 end)
 ( <optTag .*? > )?            # (2)
 (                             # (3 start)
      (?:
           (?! <optTag .*? > )
           . 
      )*?
 )                             # (3 end)
 <postfix>
 $

答案 2 :(得分:0)

您可以在正则表达式中添加边界“ \ b”一词,以在第2组中获取所需的值。

这个ReGeX为我工作,

^<prefix>(.*?)(\b<optTag.*>\b)(.*?)<postfix>$

您可以阅读更多here