c# - 正则表达式 - 忽略空格
问题描述
我有一个正则表达式:
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# 演示。
推荐阅读
- r - 如何删除模式前的所有文本?
- android-studio - 如何在 Android Studio 中操作行之间的网格布局间距?
- git - 为什么 BitBucket 和 GIT 都需要运行“克隆”?
- nodes - 更改父节点时动画运动的最佳方式?
- nlp - 在层次聚类 NLP 中提取每个聚类中 N 个最频繁的关键字
- html - 如何在html中设置图像的高度和宽度?
- android - Buildozer 构建失败:未指定 Android SDK 目录,正在退出
- sas - 如何总结不同年龄组的不同疾病组合?
- javascript - 测试组件路由器链路
- c# - 异步写入重定向的标准输出是同步的还是异步的?