gpt4 book ai didi

正则表达式以重复模式捕获每个组的第一次出现

转载 作者:行者123 更新时间:2023-12-02 09:10:06 24 4
gpt4 key购买 nike

假设我有以下文本:

Name: John Doe\tAddress: Street 123 ABC\tCity: MyCity

我有一个正则表达式(有点复杂,但归结为这个):

^(?:(?:(?:Name: (.+?))|(?:Address: (.+?))|(?:City: (.+?)))\t*)+$

它有三个捕获组,可以捕获名称、地址和城市的值(如果它们出现在文本中)。这里还有几个例子:https://regex101.com/r/37nemH/6 . EDIT 事先没有固定顺序,也可能发生字段\t分隔的情况字符。

现在一切正常,唯一的小问题是当一个字段在同一文本中出现两次时,正如我放在 regex101 上的最后一个示例所示:

Name: John Doe\tAddress: Street 123 ABC\tCity: MyCity\tAddress: Other Address

我想要的是第二个捕获组匹配第一个地址,即Street 123 ABC ,最好让第二次出现在“城市”组中匹配,即

1: John Doe
2: Street 123 ABC
3: MyCity\tAddress: Other Address

从概念上讲,我尝试用消极的后视来做到这一点,例如替换 (?:Address: (.+?))(?:(?<!.*Address: )Address: (.+?)) ,即确保 Address:匹配未在文本中的某处由另一个 Address: 进行标签。但是,负后视不允许任意长度,所以这显然行不通。

这可以使用正则表达式实现吗?如何实现?

最佳答案

对于您陈述的问题,您可以将此正则表达式与条件构造一起使用:

^.*?(?:(?:Name: (.+?)|(Address: )(.+?)|City: ((?(2).*?Address: )*.+?))\t*)+$

RegEx Demo

您的值在捕获的组 1、3、4 中可用。

捕获组 2 用于文字标签 "Address: "

此处,(?(2).*?Address: )* 是一个条件构造,这意味着如果捕获的组 2 存在,则在组 4 中匹配文本直到下一个 Address: 找到(0 个或多个匹配项)。

对于文本 Name: John Doe Address: Street 123 ABC City: MyCity Address: Second address,它将具有以下匹配项:

Group 1.    169-177 `John Doe`
Group 2. 178-187 `Address: `
Group 3. 187-201 `Street 123 ABC`
Group 4. 210-240 `MyCity Address: Second address`

关于正则表达式以重复模式捕获每个组的第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53429201/

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