正则表达式 - 忽略空格

戴维斯

我有一个正则表达式:

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
维克多·斯特里比尤夫

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

您可以添加\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# 演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章