我有一个正则表达式:
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] 删除。
我来说两句