是否可能有重叠的正则表达式匹配?

63 浏览
0 Comments

是否可能有重叠的正则表达式匹配?

以这个数据为例:

ID: JK546|Guitar: 0|Piano: 1|Violin: 0|Expiry: Aug14,2021

我想知道是否有可能创建一个正则表达式来返回这组匹配项:

ID: JK546|Guitar: 0|Expiry: Aug14,2021
ID: JK546|Piano: 1|Expiry: Aug14,2021
ID: JK546|Violin: 0|Expiry: Aug14,2021

我尝试了下面的正则表达式:

ID: (?\w+).*\|(?\w+):\s(?\d).*Expiry:\s(?[\w\d]+)

但它只返回了带有小提琴乐器的一条。非常感谢您的见解。

0
0 Comments

在使用正则表达式进行匹配时,有时候可能会遇到重叠的匹配结果。这种情况下,我们希望能够获取所有重叠的匹配结果,而不仅仅是第一个匹配结果。

对于这个问题,我们可以利用.NET的Groups.Captures属性来获取吉他、钢琴和小提琴的值。

正则表达式模式为:

(ID: \w+\|)(\w+: \d+\|)+(Expiry: \w+,\d+)

该模式匹配的内容如下:

- (ID: \w+\|) 捕获组1,匹配 "ID: ",后跟一个或多个单词字符和 "|"

- (\w+: \d+\|)+ 捕获组2,重复1次或多次,匹配一个或多个单词字符,后跟一个冒号和一个或多个数字,再后跟一个 "|"

- (Expiry: \w+,\d+) 捕获组3,匹配 "Expiry: ",后跟一个或多个单词字符,逗号和一个或多个数字

我们可以通过以下代码来实现匹配并获取重叠的结果:

var str = "ID: JK546|Guitar: 0|Piano: 1|Violin: 0|Expiry: Aug14,2021";
string pattern = @"(ID: \w+\|)(\w+: \d+\|)+(Expiry: \w+,\d+)";
Match m = Regex.Match(str, pattern);
foreach(Capture c in m.Groups[2].Captures) {
    Console.WriteLine(m.Groups[1].Value + c.Value + m.Groups[3].Value);
}

输出结果为:

ID: JK546|Guitar: 0|Expiry: Aug14,2021
ID: JK546|Piano: 1|Expiry: Aug14,2021
ID: JK546|Violin: 0|Expiry: Aug14,2021

以上就是解决重叠匹配结果的原因和解决方法。通过利用Groups.Captures属性,我们可以获取到所有重叠的匹配结果。

0
0 Comments

在这段文字中,提到了一个关于使用正则表达式匹配多个重叠结果的问题。作者提到自己对C#中的正则表达式处理不熟悉,但是给出了一个可以实现该功能的sed命令。接下来,作者解释了该命令的原理和用法,并给出了一个示例字符串和相应的输出结果。

该sed命令的功能是通过循环匹配输入字符串中的不同部分,并将匹配结果打印出来。具体的实现步骤如下:

- 使用`-n`选项告诉sed不自动打印任何内容,只有在使用`p`命令时才打印。

- 使用`:loop`标签来表示循环的开始。

- 使用`h`命令将模式空间保存到保持空间中,即将字符串做一个副本。

- 使用`s/^\([^|]*|[^|]*\).*\(|.*\)$/\1\2/p`命令捕获第一个和第二个段以及最后一个段,并打印结果。所以,输入字符串"A|B|C|D|E"将变成"A|B|E",即第一个期望的输出。

- 使用`g`命令将保持空间中保存的字符串恢复到模式空间中,即检索保存的字符串副本。

- 使用`s/^\([^|]*\)|[^|]*\(|.*\)$/\1\2/`命令捕获第一个段,跳过第二个段,然后捕获剩下的部分。所以,输入字符串"A|B|C|D|E"将变成"A|C|D|E"。

- 使用`t loop`命令是一个“goto”命令,如果最近的替换成功,则返回循环的开始。也就是说,这是循环的结尾和循环条件的指定。

通过以上的操作,可以实现对输入字符串的多次匹配和打印。文章中还提到了循环的第二次迭代将把"A|C|D|E"变成"A|C|E"并打印出来,然后将"A|C|D|E"变成"A|D|E"并迭代。循环的第三次迭代将"A|D|E"变成"A|D|E"并打印出来(显然没有变化,因为正则表达式中的`.*`匹配"A|D"和"|E"之间的零长度字符串)。最后一次替换将"A|D|E"变成"A|E",然后就没有剩下的内容可以匹配了。

所以,通过这段文字可以得出结论,提到的问题是关于如何使用正则表达式匹配多个重叠结果的。为了解决这个问题,可以使用sed命令中的循环结构和替换命令来处理。这个方法可以通过多次迭代和替换来实现对输入字符串中不同部分的匹配和打印。

0
0 Comments

在这个问题中,作者想要找到一个解决办法来处理一个字符串中的重叠正则表达式匹配。作者提到不建议使用正则表达式,因为给定的字符串并不是严格匹配,而是需要替换。然而,没有一个很好的方法可以得到所有匹配的所有替换。

因此,作者建议采用将输入字符串按照 "|" 进行分割的方法。然后,需要组合一个结果字符串,该字符串由第一个字段、一个中间字段和最后一个字段组成。对于每个存在的中间字段,将得到一个结果。如果字符串分割为N个字段,那么将得到N-2个结果。例如:如果分割为5个字段,则会得到3个结果,分别对应每个"中间"字段。

作者给出了一个C#的示例代码来实现这个思路。首先,将给定的字符串按照 "|" 进行分割,并存储在一个数组中。然后,使用一个循环来遍历中间字段的索引,从1到字段长度减1。在每次循环中,使用string.Join()方法将第一个字段、中间字段和最后一个字段组合成一个结果字符串,并将其打印出来。

最终的输出结果如下:

ID: JK546|Guitar: 0|Expiry: Aug14,2021

ID: JK546|Piano: 1|Expiry: Aug14,2021

ID: JK546|Violin: 0|Expiry: Aug14,2021

通过这种方法,可以得到原始字符串中所有重叠正则表达式匹配的替换结果。

0