从字符串中提取数字以创建仅包含数字的字符串。

12

我拿到了一些格式很差的数据,需要从字符串中抽取数字。我不确定最好的方法是什么。这些数字可以是任意长度。

string a = "557222]]>";
string b = "5100870<br>";

有什么办法可以让我得到这个吗:

a = "557222"
b = "5100870"

谢谢

解决方案适用于C#,抱歉。我已编辑问题以包含该标签。


你的数字中间可能会出现“坏数据”吗? - Reed Copsey
不,它只会在两端。 - kevp
8个回答

33

你可以编写一个简单的方法来提取所有非数字字符,但这无法处理浮点数据:

public string ExtractNumber(string original)
{
     return new string(original.Where(c => Char.IsDigit(c)).ToArray());
}

这个方法只会提取“数字” - 根据您想要的结果,您也可以使用Char.IsNumber而不是Char.IsDigit


IsDigit函数提取以下内容:分数、下标、上标、罗马数字、货币分子、环绕数字和特定于脚本的数字。如果你说“仅提取数字”,可能会给某人留下错误印象。请参考我的答案,以获取只有0-9字符的结果。 - Atters
可以更短,如下所示:public static string ExtractNumber(string original) => new string(original.Where(char.IsDigit).ToArray()); :) - Patrick

13

尝试这个单行命令:

Regex.Replace(str, "[^0-9 _]", "");

这对浮点数不起作用,因为它会移除小数点和负号。 - Kamran Bigdely

8

对于.NET的代码不够熟悉。然而,有两种方法:

  • 将其转换为整数。如果非数字字符在末尾(即21389abc),则这是最简单的方法。
  • 如果您有交错的非数字字符(即1231a23v)并且想保留每个数字,请使用正则表达式[^\d]替换非数字字符。

3
正则表达式加一分。使用C#,您可以使用类似的方法 Regex.split(str, "[^\d]"),然后使用 string.join("", Regex.split(...)) 函数。 - Ryan
@Ryan,谢谢。我从来没有深入研究过.NET。但是逻辑超越语言 :) - Jason McCreary
2
与其使用分割/连接混乱的方法,更简单的解决方案是: new Regex(@"\D").Replace(source ?? "", ""); - K Kimble

7

您可以使用一个简单的正则表达式:

var numericPart = Regex.Match( a, "\\d+" ).Value;

如果您需要它成为实际的数值,您可以使用int.Parseint.TryParse


6
您可以使用LINQ。下面的代码将字符串筛选为仅包含数字的IEnumerable,然后将其转换为char []。然后,字符串构造函数可以将char []转换为字符串:
string a = "557222]]>";
string b = "5100870<br>";

a = new string(a.Where(x => char.IsDigit(x)).ToArray());
b = new string(b.Where(x => char.IsDigit(x)).ToArray());

4

试试这个

string number = Regex.Match("12345<br>", @"\d+").Value;

这将返回第一组数字。例如:对于输入"a 123 b 456 c",它将返回"123"


4

这个问题并没有明确说明你只想要字符0到9,但从你的示例集和评论中可以推断出这一点。所以这里是能够实现此功能的代码。

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

为什么不建议使用Char.IsDigit()函数——因为数字包括分数、下标、上标、罗马数字、货币分子、环绕数字和特定脚本的数字等字符。


0
这里是适用于我的情况的版本。
    public static string ExtractNumbers(this string source)
    {
        if (String.IsNullOrWhiteSpace(source))
            return string.Empty;
        var number = Regex.Match(source, @"\d+");
        if (number != null)
            return number.Value;
        else
            return string.Empty;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接