首页 > 解决方案 > 正则表达式 - 忽略空格

问题描述

我有一个正则表达式:

Regex.Match(result, @"\bTop Rate\b.*?\s*\s*([\d,\.]+)", RegexOptions.IgnoreCase);

然后解析成 int

topRate = int.Parse(topRateMatch.Groups[1].Value, System.Globalization.NumberStyles.AllowThousands);

例子)

Top Rate: 888,888
Output: 888888

通过使用我当前的正则表达式,我得到了 int 输出。但是,我注意到当数字之间有空格时,例如,

Top Rate: 8         88,888

我只得到 8 分。有没有办法忽略数字之间/最高费率字母之后可能存在或不存在的任何空格?

示例)

Top Rate:                       8                      88,888
Expected output: 888888

Top Rate:                       8     88,888
Expected output: 888888

Top Rate: 8                      88,888
Expected output: 888888

Top Rate: 8 8 8,888
Expected output: 888888

Top Rate: 888,          8  88
Expected output: 888888

标签: c#regex

解决方案


首先,在匹配和捕获数字时不能跳过或省略空格,只能通过在给定字符串后提取多个匹配项来做到这一点。但是,有一个简单的两步方法。

您可以添加\s以匹配任何空格或\p{Zs}\t任何水平空格匹配到字符类。我建议\d先捕获数字,然后在末尾使用带有数字模式的可选非捕获组,以确保捕获的数字以数字开头和结尾:

\bTop Rate\b.*?(\d(?:[\d,.\s]*\d)?)

请参阅正则表达式演示。请注意,重复\s*\s*几乎没有意义,\s*已经匹配零个或多个空白字符,甚至\s*是多余的,因为.*?它尽可能少地匹配除 LF 字符之外的任何零个或多个字符。要使其跨行匹配,请添加该RegexOptions.Singleline选项。

详情

  • \bTop Rate\b- 一个完整的词Top Rate
  • .*?- 除换行符之外的任何零个或多个字符尽可能少
  • (\d(?:[\d,.\s]*\d)?)- 第 1 组:
    • \d- 一个数字
    • (?:[\d,.\s]*\d)? - 一个可选的非捕获组,匹配零个或多个数字,.或空格,然后是一个数字。

接下来,当你得到匹配时,只保留数字。

var text = "Top Rate: 8                      88,888";
var result = Regex.Match(text, @"\bTop Rate\b.*?(\d(?:[\d,.\s]*\d)?)", RegexOptions.Singleline);
if (result.Success)
{
    Console.WriteLine( new string(result.Groups[1].Value.Where(c => char.IsDigit(c)).ToArray()) );
}

请参阅C# 演示。多重匹配:

var text = "Top Rate: 8                      88,888 and Top Rate:                       8  \n   88,888";
var results = Regex.Matches(text, @"\bTop Rate\b.*?(\d(?:[\d,.\s]*\d)?)", RegexOptions.Singleline)
        .Cast<Match>()
        .Select(x => new string(x.Groups[1].Value.Where(c => char.IsDigit(c)).ToArray()));
foreach (var s in results)
{
    Console.WriteLine( s );
}

请参阅此 C# 演示


推荐阅读