我不明白,为什么此正则表达式无法按我预期的方式工作:
正则表达式:^<prefix>(.*?)(<optTag.*?>)?(.*?)<postfix>$
测试:<prefix>some chars<optTag value>some chars<postfix>
测试结果:
第1组:空
第2组:空
第3组:some chars<optTag value>some chars
我希望第2组= <optTag value>
答案 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。