【问题标题】:Extract only numbers from text仅从文本中提取数字
【发布时间】:2016-10-27 08:16:43
【问题描述】:

我正在尝试仅从字符串/文本中提取数字。下面是我正在使用的正则表达式模式。

Regex regex = new Regex(@"[\d+]\S+");
string extract_from = " 12 abcd 1-2-3a a123z 1.2.3.4 xyz";

从上面的字符串“extract_from”中,正则表达式正在提取数字

12
1-2-3a
123z
1.2.3.4

正则表达式正在正确提取它,除了第二个和第三个“1-2-3a”、“123z”,因为它包含一个字母,所以不应该被提取。我可以在正则表达式中添加什么模式来不提取数字之间也有字母的地方?

破折号和点都可以,只是字母不行。

【问题讨论】:

  • 您是在寻找数字,还是不是字母? 1-2-3 不是数字,1.2.3.4 也不是
  • - 和 .很好。只是不是字母

标签: c# regex parsing pattern-matching match


【解决方案1】:

在这里,将正则表达式 \S 更改为 \s,注意大写。

\S 匹配除空格以外的所有字符,\s 匹配空格。

Regex regex = new Regex(@"[\d+]\s+");

【讨论】:

    【解决方案2】:

    试试这个:

    [0-9\-.]+\s+
    

    这将允许表达式包含多于一位小数,并在其中包含破折号,而不是仅在开头。

    您可以使用 regexhero.net 或 www.regexplanet.com 来测试您的正则表达式,它们是非常强大的工具。

    给定输入的输出将是以下匹配项:

    12
    1.2.3.4
    

    根据 OP 的评论进行编辑 此正则表达式的开头不应需要空格。如果您需要匹配行尾的数字,最简单的方法可能是为其添加特殊情况:

    [0-9\-.]+\s|[0-9\-.]+$
    

    【讨论】:

    • 您的解决方案有效。在我将其标记为正确答案之前只有一个问题。如果文本开头有空格而结尾没有空格,那么正则表达式与它不匹配怎么办。如何匹配两个条件,前面只有空格,结尾没有空格,两端都有空格。
    • @sid,更新了我的答案以解决您的评论
    【解决方案3】:

    使用此模式捕捉除字母以外的任何内容

    (?!\S*[a-zA-Z])\b([^a-zA-Z\s]+)\b
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多