c# - 正则表达式模式不适用于我的 C# 代码,但它适用于在线测试仪
问题描述
我想从包含特定关键字的字符串中提取双精度值。例如:
金额:3,747,190.67美元
我需要使用关键字 Amount 从上面的字符串中提取值“3,747,190.67”,因为我在不同的在线正则表达式测试器中测试了这种模式并且它有效:
(?<=\bAmount.*)(\d+\,*\.*)*
但是它不适用于我的 C# 代码:
if (type == typeof(double))
{
double doubleVal = 0;
pattern = @"(?<=\bAmount.*)(\d+\,*\.*)*";
matchPattern = Regex.Match(textToParse, pattern);
if (matchPattern.Success)
{
double.TryParse(matchPattern.Value.ToString(), out doubleVal);
}
return doubleVal;
}
解决方案
这个有效:
(?<=\bAmount.*)\d+(,\d+)*(\.\d+)?
(?<=\bAmount.*)
后面的样子\d+
前导数字(至少一位)(,\d+)*
千组(零次或多次)(\.\d+)?
小数(?
=可选)
请注意,正则表达式测试器会为您的模式显示“找到 9 个匹配项”。对于我的模式,它说“找到 1 个匹配项”。
您的模式的问题在于它的第二部分(\d+\,*\.*)*
可能是空的,因为*
最后。*
量词表示零次、一次或多次重复。因此,look-behind 发现 和 之间有 8 个空条目Amount
。9 场比赛中的最后一场是号码。*
您可以通过将 替换为来纠正它+
。请参阅:regextester 与 *,regextester 与 +。您也可以使用“您的”测试仪对其进行测试并切换到表格以查看详细结果。
我的解决方案不允许使用连续的逗号或点,但允许没有千组或小数部分的数字。
推荐阅读
- java - Spring @Transaction 和 @Async 用于数据库操作
- c - 隐藏赋值的C宏技巧?
- bash - 如何逐行比较两个文件并在不同时输出整行
- java - 为什么我不能像行一样简单地获得一维数组?
- java - 如何在 Wiremock Servlet 上启用响应模板?
- php - 在 codeigniter 中的多个表中插入数据时出错
- python - 运行 .py 文件和直接与 Python 交互的时区差异
- java - 如何使java小程序自动全屏?(蚀)
- ios - 我可以在 Swift Playground 中加载 Alex Voice
- amazon-web-services - 示例 Amazon S3 POST 对象签名计算