gpt4 book ai didi

Java 正则表达式 : how to back-reference capturing groups in a certain context when their number is not known in advance

转载 作者:太空宇宙 更新时间:2023-11-04 07:05:40 25 4
gpt4 key购买 nike

作为介绍性说明,我知道关于使用正则表达式解决问题的老话,并且我也知道使用正则表达式处理 XML 的注意事项。但请耐心等待一下......

我正在尝试进行正则表达式搜索并替换一组字符。我事先不知道该组的匹配频率,但我只想在特定上下文中进行搜索。

一个例子:如果我有以下字符串 "**ab**df**ab**sdf**ab**fdsa**ab**bb"我想搜索 "ab"并替换为 "@ab@" ,使用以下正则表达式可以正常工作:

搜索正则表达式:

(.*?)(ab)(.*?)

替换:

$1@$2@$3

正如预期的那样,我总共获得了四场比赛。在每场比赛中,组 ID 都是相同的,因此反向引用 ($1, $2 ...) 也可以正常工作。

但是,如果我现在向字符串添加特定上下文,则上面的正则表达式将失败:

搜索字符串:

<context>abdfabsdfabfdsaabbb</context>

搜索正则表达式:

<context>(.*?)(ab)(.*?)</context>

这只会找到第一个匹配项。但即使我向原始正则表达式添加非捕获组,它也不起作用( "<context>(?:(.*?)(ab)(.*?))*</context>" )。

我想要的是第一次搜索中的匹配列表(没有上下文),其中每个匹配中的组 ID 都是相同的。

知道如何实现这一目标吗?

最佳答案

解决方案

您的需求与 this question 中的相似。 :匹配并捕获前缀和后缀之间模式的多个实例。使用this answer of mine中描述的方法:

(?s)(?:<context>|(?!^)\G)(?:(?!</context>|ab).)*ab

根据需要添加捕获组。

警告

请注意,正则表达式仅适用于仅允许仅包含文本的标签。如果一个标签包含其他标签,那么它将无法正常工作。

它也匹配 ab里面<context>没有结束标签的标签 </context> 。如果您想防止这种情况发生,那么:

(?s)(?:<context>(?=.*?</context>)|(?!^)\G)(?:(?!</context>|ab).)*ab

说明

让我们分解正则表达式:

(?s)                        # Make . matches any character, without exception
(?:
<context>
|
(?!^)\G
)
(?:(?!</context>|ab).)*
ab

(?:<context>|(?!^)\G)确保我们要么进入一个新的<context>标记,或从上一个匹配继续并尝试匹配子模式的更多实例。

(?:(?!</context>|ab).)*匹配我们不关心的任何文本(不是 ab )并阻止我们越过结束标记 </context> 。然后我们匹配我们想要的模式ab在最后。

关于Java 正则表达式 : how to back-reference capturing groups in a certain context when their number is not known in advance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21428545/

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