繁体   English   中英

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

[英]Regex match but ignore specific characters in the output

我需要一个正则表达式PATTERN (在C#中使用),它将使用 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删除逗号; 这一切都必须在regex PATTERN发生(因为我的所有regex表达式都是从数据库中提取的,并且如果没有大量的意大利面条代码,就无法在模式本身之外包含逻辑)。 如前所述,我宁愿不匹配理性值,但是一旦我使逗号排除起作用,那应该很容易解决。

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

// 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,因此如果可以负担得起添加一些通用代码,则可以利用捕获堆栈尝试进行真正的丑陋破解。

首先,正则表达式。 它被简化到最小程度,以便于理解:

(?:(?<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演示

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

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

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

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM