关于c#:使用正则表达式从字符串中提取多个数字

Using regex to extract multiple numbers from strings

我有一个包含两个或更多数字的字符串。以下是几个例子:

1
2
3
"(1920x1080)"
" 1920 by 1080"
"16 : 9"

我如何从中提取"1920"和"1080"这样的单独数字,假设它们只由一个或多个非数字字符分隔?


基本的正则表达式是:

1
[0-9]+

您需要使用库来检查所有匹配项并获取它们的值。

1
2
3
4
5
6
var matches = Regex.Matches(myString,"[0-9]+");

foreach(var march in matches)
{
   // match.Value will contain one of the matches
}

您可以通过以下方式获取字符串

1
2
3
4
5
MatchCollection v = Regex.Matches(input,"[0-9]+");
foreach (Match s in v)
            {
                // output is s.Value
            }


你可以使用

1
2
3
4
5
6
string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"};
foreach (var item in input)
{
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray();
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]);
}

输出:

1
2
3
1920,1080
1920,1080
16,9


1
(\d+)\D+(\d+)

之后,定制这个regex以匹配您将要使用的语言的风格。


不过,仍然存在一个问题,所有上述答案在不应考虑12i或a2的有效数字时都会考虑。

下面可以解决这个问题

1
var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)");

但这个解决方案又增加了一个问题:)这将捕获整数周围的空格。为了解决这个问题,我们需要将整数的值捕获到一个组中:

1
2
3
4
5
6
MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)");
HashSet<string> uniqueNumbers = new HashSet<string>();
foreach (Match m in matches)
{
    uniqueNumbers.Add(m.Groups[1].Value);
}