【问题标题】:Regex - Match a certain string and get the integer value of the stringRegex - 匹配某个字符串并获取该字符串的整数值
【发布时间】:2021-09-10 21:17:37
【问题描述】:

我有一个正则表达式:

var example= Regex.Match(result, @"\b(Today is:)[\s:]*(.*)", RegexOptions.IgnoreCase);

然后我转换

example= int.Parse(result.Groups[2].Value, System.Globalization.NumberStyles.AllowThousands);

这在大多数情况下都可以正常工作,但是,我注意到如果在 Today is 之后有额外的字符串:例如,

Today is (extra):

我上面的正则表达式在这种情况下失败了,因为它也抓取了“(额外)”然后进入 int.Parse,它失败了。我希望我的正则表达式在有“今天是:”时匹配,那么即使有更多的字符串也没关系,只需获取字符串并转换为int值即可。

例如, 今天是:100,000,000 -> 转换并得到 int 100000000

今天是 (abc123): 88,888 -> 转换并得到 int 88888

今天是(Extra Text blah blah):100,000 -> 转换并获得 int 100000

【问题讨论】:

  • 您的正则表达式模式适用于您提供的 3 个示例?我没有看到它在线工作:regexr.com/60s92
  • 你能非常准确(用英文而不是代码)你试图解析的字符串的格式吗?它必须遵守的预期规则是什么?
  • 应该是\b(今天是:)[\s:]*(.*)
  • \: (\d.*) 应该这样做;你想要: 之后的数字,对吗?如果是这样,您可以获得第一组值。
  • 字符串的格式总是以“Today is”开头(不区分大小写)。所以它总是@"\b(今天是:)[\s:]* 开始。

标签: c# regex


【解决方案1】:

我会像这样改变你的正则表达式:

\bToday is\b.*?\s*:\s*([\d,\.]+)

在这里测试:https://regex101.com/r/jPb6Pa/1

解释:

  • \bToday is\b 用于搜索“今天是”而不是“Blablatoday 不是”或类似的内容。

  • .*? 搜索“今天是”之后的任何内容,但方式并不好。

  • \s*:\s* 搜索“:”字符周围有或没有空格。

  • 捕获组 n°1 ([\d,\.]+) 将搜索数字、点和逗号,至少一个字符。它可以改进,因为单个逗号或点是错误的。但它暂时完成了这项工作。

【讨论】:

  • 我们可以将“:”设为可选吗?因此,如果 Today is 没有冒号,则只需获取该值。如果它有,那么也得到价值
  • @davis,是的,如果您想要一个可选的:,那么只需在其后添加一个问号。这导致bToday is\b.*?\s*:?\s*([\d,\.]+)
【解决方案2】:

你可以使用

\bToday\s+is\b(?:.*?\([^()]*\))?.*?\b(\d+(?:,\d{3})*(?:\.\d+)?)

请参阅regex demo。解析match.Groups[1].Value

详情

  • \bToday\s+is\b - Today is 之间包含任何一个或多个空格的整个单词
  • (?:.*?\([^()]*\))? - 除换行符之外的任何零个或多个字符的可选序列,后跟(,除() 之外的零个或多个字符,然后是) 字符李>
  • .*? - 除换行符之外的任何零个或多个字符尽可能少
  • \b - 单词边界
  • (\d+(?:,\d{3})*(?:\.\d+)?) - 第 1 组:数字模式。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2014-11-18
    • 2016-02-10
    • 1970-01-01
    • 2019-03-14
    • 2020-11-13
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多