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); } |