gpt4 book ai didi

c# - 在单个字符串上运行多个 RegEx 模式

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

我需要在字符串上运行 C# RegEx 匹配。
问题是,我在单个字符串上寻找多个模式,但我无法通过一次运行找到一种方法。

例如,在字符串中

The dog has jumped

我正在寻找“狗”和“狗有”。

我不知道我怎么能一次得到这两个结果。

我尝试将模式与更改符号 (|) 连接起来,如下所示:
(dog|dog has)

但它只返回了第一场比赛。

我可以用什么来取回两场比赛?

谢谢!

最佳答案

正则表达式引擎将返回满足模式的第一个子字符串。如果你写 (dog|dog has) ,它将永远无法匹配 dog has因为 dog hasdog 开头,这是第一个选择。此外,正则表达式引擎不会返回重叠的匹配项。

这是一个复杂的方法:

var patterns = new[] { "dog", "dog has" };

var sb = new StringBuilder();
for (var i = 0; i < patterns.Length; i++)
sb.Append(@"(?=(?<p").Append(i).Append(">").Append(patterns[i]).Append("))?");

var regex = new Regex(sb.ToString(), RegexOptions.Compiled);
Console.WriteLine("Pattern: {0}", regex);

var input = "a dog has been seen with another dog";
Console.WriteLine("Input: {0}", input);

foreach (var match in regex.Matches(input).Cast<Match>())
{
for (var i = 0; i < patterns.Length; i++)
{
var group = match.Groups["p" + i];
if (!group.Success)
continue;

Console.WriteLine("Matched pattern #{0}: '{1}' at index {2}", i, group.Value, group.Index);
}
}

这会产生以下输出:

Pattern: (?=(?<p0>dog))?(?=(?<p1>dog has))?
Input: a dog has been seen with another dog
Matched pattern #0: 'dog' at index 2
Matched pattern #1: 'dog has' at index 2
Matched pattern #0: 'dog' at index 33

是的,这是对正则表达式引擎的滥用:)

这通过使用可选的前瞻构建模式来工作,该模式捕获子字符串作为副作用,但模式始终匹配空字符串。所以有 n+1匹配总数, n是输入长度。模式不能包含编号的反向引用,但您可以改用命名的反向引用。

此外,这可以返回重叠匹配,因为它将尝试匹配所有字符串位置的所有模式。

但是您绝对应该根据手动方法(循环模式并分别匹配每个模式)对此进行基准测试。我不希望这会很快......

关于c# - 在单个字符串上运行多个 RegEx 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671695/

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