gpt4 book ai didi

java - 具有奇怪行为的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:04 25 4
gpt4 key购买 nike

过去两天我一直在努力解决这个问题......

请帮助我理解为什么会这样。我的意图是只选择 <HDR>有一个 <DTL1 val="92">.....</HDR>

这是我的正则表达式

(?<=<HDR>).*?<DTL1\sval="3".*?</HDR>

输入的字符串是:

<HDR>abc<DTL1 val="1"><DTL2 val="2"></HDR><HDR><DTL1 val="92"><DTL2 val="55"></HDR><HDR><DTL1 val="3"><DTL2 val="4"></HDR>

但是这个正则表达式选择

abc<DTL1 val="1"><DTL2 val="2"></HDR><HDR><DTL1 val="92"><DTL2 val="55"></HDR>

谁能帮帮我?

最佳答案

正则表达式引擎将始终为您提供字符串中最左边的匹配项(即使您使用非贪婪量词)。这正是您获得的。

因此,一个解决方案是禁止另一个 <HDR> 的存在在 .*? 描述的部分中这太宽容了。

您有两种技术可以做到这一点,您可以替换 .*?与:

(?>[^<]+|<(?!/HDR))*

或与:

(?:(?!</HDR).)*+

大多数时候,第一种技术性能更高,但如果您的字符串包含高密度的 < , 第二种方式也能得到很好的结果。

使用possessive quantifieratomic group可以减少获得结果的步骤数,尤其是在子模式失败时。

例子:

第一种方式:

(?<=<HDR>)(?>[^<]+|<(?!/HDR))*<DTL1\sval="3"(?>[^<]+|<(?!/HDR))*</HDR>

或这个变体:

(?<=<HDR>)(?:[^<]+|<(?!/HDR|DTL1))*+<DTL1\sval="3"(?:[^<]+|<(?!/HDR))*+</HDR>

第二种方式:

(?<=<HDR>)(?:(?!</HDR).)*<DTL1\sval="3"(?:(?!</HDR).)*+</HDR>

或这个变体:

(?<=<HDR>)(?:(?!</HDR|DTL1).)*+<DTL1\sval="3"(?:(?!</HDR).)*+</HDR>

关于java - 具有奇怪行为的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com