【问题标题】:Extract a value after a character and unknown amount of non-digit characters在一个字符和未知数量的非数字字符之后提取一个值
【发布时间】:2020-03-03 15:10:37
【问题描述】:

从下面的数据中,我需要从 RegEx 中提取值金额,如下面的粗体所示。我正在使用https://regex101.com/ 来测试表达式的值,但不能完全正确,RegEx 可以实现这一点吗?我正在尝试提取 % 符号后的值。

%\d?.*

以上匹配 % 之后的所有内容,但我只是在寻找值。

测试 1 46.6500% $4,463.82

测试 2 36.5000% 25,215.72

【问题讨论】:

  • 这对你有用吗? [^%]*$
  • 尝试%\D*(\d(?:[.,\d]*\d)?)$,参见regex101.com/r/fRM7Gw/1,获取第1组值。请注意,您不需要任何环顾四周,除非您解释此要求背后的原因。
  • @William Humphries 那么也许是这个? [^% ]*$ 这假设您总是在 % 之后有一个空格,并且在要提取的字符串中没有任何空格。
  • 什么是正则表达式?正如regex tag info 所述,所有带有此标签的问题还应包含一个标签,指定适用的编程语言或工具。
  • 因此,在 C# 中,您可以使用 Regex.Match(str, @"%\D*(\d(?:[.,\d]*\d)?)$")?.Groups[1].ValueRegex.Match(str, @"(?<=%\D*)\d(?:[.,\d]*\d)?$")?.Value

标签: .net regex regex-lookarounds


【解决方案1】:

您可以使用两种方法:

  • 使用捕获组,一旦找到匹配项,获取组 1 值
  • 如果正则表达式引擎支持可变宽度的lookbehind 模式,使用它来设置左侧上下文模式不会被“消耗”,不会被添加到匹配值,但匹配模式是必需的。

第一种方法可以用

实现
%\D*(\d(?:[.,\d]*\d)?)$
    ^-- cap. group --^

this regex demo

第二种方法(基于lookbehind)正则表达式是

(?<=%\D*)\d(?:[.,\d]*\d)?$
^-  LB -^

this regex demo

模式详情

  • (?&lt;=%\D*) - 一个积极的后向观察,需要 % 紧跟当前位置左侧的 0+ 个非数字字符
  • % - 一个 % 字符
  • \D* - 0 个或多个非数字字符
  • (\d(?:[.,\d]*\d)?) - 第 1 组:
    • \d - 一个数字
    • (?:[.,\d]*\d)? - 一个可选的非捕获组,匹配一次或零次出现:
      • [.,\d]* - ., 或数字出现 0 次或多次
      • \d - 一个数字
  • $ - 字符串结束。

由于您使用 .NET,以下是 C# 代码 sn-ps,展示了如何使用两种方法提取第一个匹配项:

var result1 = Regex.Match(str, @"%\D*(\d(?:[.,\d]*\d)?)$")?.Groups[1].Value;
var result2 = Regex.Match(str, @"(?<=%\D*)\d(?:[.,\d]*\d)?$")?.Value; 

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 2019-09-29
    • 2021-08-03
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多