gpt4 book ai didi

正则表达式:以不同顺序匹配组而不重复组

转载 作者:行者123 更新时间:2023-12-03 21:20:30 24 4
gpt4 key购买 nike

假设我有两个这样的字符串:

XABY
XBAY

匹配两者的简单正则表达式如下所示:
X(AB|BA)Y

但是,我有一个 A 和 B 是复杂字符串的情况,我正在寻找一种方法来避免必须指定它们中的每一个两次(在 | 的每一侧)。有没有办法做到这一点(这可能比必须指定两次更简单)?

谢谢

最佳答案

X(?:A()|B()){2}\1\2Y

基本上,您使用一个空的捕获组在匹配时检查每个项目,然后反向引用确保所有内容都已被检查。

请注意,这依赖于未记录的正则表达式行为,因此无法保证它会在您的正则表达式风格中起作用——如果是这样,则无法保证随着该风格的发展它会继续起作用。但据我所知,它适用于支持反向引用的各种风格。 (编辑:它在 JavaScript 中不起作用。)

编辑:您说您正在使用命名组来捕获匹配的部分内容,如果不是真正的复杂性,这会给正则表达式增加很多视觉困惑。好吧,如果您碰巧在使用 .NET 正则表达式,您仍然可以对“复选框”使用简单的编号组。这是一个简单的示例,它在不知道内部顺序的情况下查找并挑选出一堆月日字符串:
  Regex r = new Regex(
@"(?:
(?<MONTH>Jan|Feb|Mar|Apr|May|Jun|Jul|Sep|Oct|Nov|Dec)()
|
(?<DAY>\d+)()
){2}
\1\2",
RegexOptions.IgnorePatternWhitespace);

string input = @"30Jan Feb12 Mar23 4Apr May09 11Jun";
foreach (Match m in r.Matches(input))
{
Console.WriteLine("{0} {1}", m.Groups["MONTH"], m.Groups["DAY"]);
}

这是因为在 .NET 中,命名组的存在对非命名组的排序没有影响。已命名组具有分配给它们的编号,但这些编号从最后一个未命名组之后开始。 (我知道这看起来很复杂,但这样做有充分的理由。)

通常,您希望避免同时使用命名和非命名捕获组,特别是如果您使用反向引用,但我认为这种情况可能是一个合法的异常(exception)。

关于正则表达式:以不同顺序匹配组而不重复组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596868/

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