gpt4 book ai didi

c# - 正则表达式匹配但忽略输出中的特定字符

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:13 25 4
gpt4 key购买 nike

我需要一个正则表达式 PATTERN(用于 C#),它将匹配整数值 WITH 3 位逗号分隔符,但不会返回结果中的逗号匹配值。例如,我需要以下代码来将 112341234567 写入控制台:

string text = "This 1 is 1,234 a 1,234,567 sentence 7,654.321.";
// NOTE: value "7,654.321" would preferably NOT match,
// but it is acceptable for now if it does
MatchCollection matches = Regex.Matches(text, PATTERN);
foreach (Match match in matches)
Console.Write(match.Value + " ");

不能调用 Regex.Matches 然后执行 String.Replace 来删除逗号;这一切都必须发生在正则表达式 PATTERN 中(因为我所有的正则表达式都是从数据库中提取的,并且如果没有大量的意大利面条代码就不能包含模式本身之外的逻辑)。如前所述,我不希望匹配有理数值,但一旦我使逗号排除正常工作,这应该很容易解决。

以下模式不起作用,但它可能非常接近我需要的:

// THIS PATTEN DOES NOT WORK!!!
// but is probably close to what I need
string PATTERN = @"([\+-]?[0-9]+[(?<=,)[0,9]{3}]*)([eE][\+]?[0-9]+)?"

如果你从上面删除 [(?<=,)[0,9]{3}]*,你就有了一个标准的整数模式。再一次,我需要接受整数中的逗号,但不将它们作为匹配的一部分返回。我应该如何改变这种模式?

最佳答案

正则表达式匹配输入字符串的整个子字符串。它不能是一组子字符串 - 它必须是一个子字符串。

同样,捕获组只能捕获子字符串,因此您对此也无能为力。

但由于您使用的是 .NET,如果您有能力添加一些通用代码,您可以通过利用捕获堆栈尝试一个非常丑陋的 hack。

首先,正则表达式。它被简化到最低限度,以便更容易理解:

(?:(?<concat>\d+),?)+

下面提供了完整版本的正则表达式,但现在我们将坚持使用那个版本。

然后,您可以在您的代码中实现以下逻辑:

  • 如果正则表达式不包含名为 concat 的组,则照常处理
  • 如果是,请执行以下操作而不是获取整个匹配项:
    • 提取该组的所有捕获:match.Groups["concat"].Captures
    • 连接他们捕获的值
    • 然后使用那个值

这类似于:

public static IEnumerable<string> GetValues(string input)
{
// Suppose regex could be any regex
var regex = new Regex(@"(?:(?<concat>\d+),?)+");

foreach (Match match in regex.Matches(input))
{
// Does this regex have our special feature?
if (regex.GroupNumberFromName("concat") >= 0)
{
// Concat the captured values
var captures = match.Groups["concat"].Captures.Cast<Capture>().Select(c => c.Value).ToArray();
yield return String.Concat(captures);
}
else
{
// This is a normal regex
yield return match.Value;
}
}
}

Ideone demo

好吧,这是一个 hack,但它可以让您在正则表达式中以声明和可重用的方式保持逻辑。

现在您发布的完整正则表达式在其被黑版本中看起来像这样:

(?<concat>[-+])?(?<concat>[0-9]+)(?:,(?<concat>[0-9]{3}))*(?<concat>[eE][-+]?[0-9]+)?

Demo

关于c# - 正则表达式匹配但忽略输出中的特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26148807/

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