首页 > 解决方案 > 正则表达式模式不适用于我的 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;
}

标签: c#regex

解决方案


这个有效:

(?<=\bAmount.*)\d+(,\d+)*(\.\d+)?
  • (?<=\bAmount.*)后面的样子
  • \d+                      前导数字(至少一位)
  • (,\d+)*               千组(零次或多次)
  • (\.\d+)?             小数(?=可选)

请注意,正则表达式测试器会为您的模式显示“找到 9 个匹配项”。对于我的模式,它说“找到 1 个匹配项”。

您的模式的问题在于它的第二部分(\d+\,*\.*)*可能是空的,因为*最后。*量词表示零次、一次或多次重复。因此,look-behind 发现 和 之间有 8 个空条目Amount。9 场比赛中的最后一场是号码。*您可以通过将 替换为来纠正它+。请参阅:regextester 与 *regextester 与 +。您也可以使用“您的”测试仪对其进行测试并切换到表格以查看详细结果。

我的解决方案不允许使用连续的逗号或点,但允许没有千组或小数部分的数字。


推荐阅读