正则表达式:从字符串中提取以逗号分隔的数字

本文关键字:分隔 数字 提取 字符串 正则表达式 | 更新日期: 2023-09-27 18:11:02

我需要从这样的字符串中提取用逗号分隔的数字(使用任意数量的数字和空格):

Expression type:            Answer:
(1, 2,3)                    1,2,3
(1,3,4,5,77)                1,3,4,5,77
( b(2,46,8,4,5, 52)    y)   2,46,8,4,5,52
(a (3, 8,2, 1, 2, 9) x)     3,8,2,1,2,9

正则表达式:从字符串中提取以逗号分隔的数字

试试这个模式:

'((?:'s*'d+'s*,?)+')
例如:

var results = Regex.Matches(input, @"'((?:'s*'d+'s*,?)+')");
Console.WriteLine(results[0].Value); // (1,2,3)

如果你想把它转换成整数列表,你可以用Linq:

很容易地做到这一点
var results = Regex.Matches(input, @"'((?:'s*('d+)'s*,?)+')")
                   .Cast<Match>()
                   .SelectMany(m => m.Groups.Cast<Group>()).Skip(1)
                   .SelectMany(g => g.Captures.Cast<Capture>())
                   .Select(c => Convert.ToInt32(c.Value));

或者在查询语法中:

var results = 
    from m in Regex.Matches(input, @"'((?:'s*('d+)'s*,?)+')").Cast<Match>()
    from g in m.Groups.Cast<Group>().Skip(1)
    from c in g.Captures.Cast<Capture>()
    select Convert.ToInt32(c.Value);

是确切的搜索字符串,你将永远有喜欢你发布它?

(number1科学numer3)文本…

编辑:你提供了新的例子,这应该可以处理它们:

    string input = "( b(2,46,8,4,5, 52)    y)";
    input = input.Remove(" ","");
    var result = Regex.Matches(input, @"'(([0-9]+,)+[0-9]+')");
    Console.WriteLine(result[0]);

我可能会使用这样的正则表达式:

'(('d+(?:'s*,'s*'d+)*)')

的PowerShell代码如下:

$str = @(
    "(1, 2,3)"
  , "(1,3,4,5,77)"
  , "( b(2,46,8,4,5, 52)"
  , "(a (3, 8,2, 1, 2, 9) x)"
  , "(1)"
  , "(1 2, 3)"    # no match (no comma between 1st and 2nd number)
  , "( 1,2,3)"    # no match (leading whitespace before 1st number)
  , "(1,2,3 )"    # no match (trailing whitespace after last number)
  , "(1,2,)"      # no match (trailing comma)
)
$re  = ''(('d+(?:'s*,'s*'d+)*)')'
$str | ? { $_ -match $re } | % { $matches[1] -replace ''s+', "" }

正则表达式将匹配一个(子)字符串,该字符串以左括号开始,后跟逗号分隔的数字序列(逗号前后可以包含任意数量的空格),并以右括号结束。空格随后由-replace指令删除。

如果您不想匹配单个数字("(1)"),请将正则表达式更改为:

'(('d+(?:'s*,'s*'d+)+)')

如果您希望允许在开始括号之后或结束括号之前有空格,请将正则表达式更改为:

'('s*('d+(?:'s*,'s*'d+)*)'s*')

看到也可能有空格,这里有一个建议,展开循环(这对于较大的输入更有效):

@"[(]'d+(?:,'d+)*[)]"

当然也可以用反斜杠转义括号。我只是想展示一个替代方案,我个人认为它更具可读性。

如果您最终想要获得这些数字,而不是拆分正则表达式的结果,您可以立即捕获它们:

@"[(](?<numbers>'d+)(?:,(?<numbers>'d+))*[)]"

现在组numbers将是所有数字的列表(字符串)。

我又完全忘记了空格,所以这里有空格(不是捕获的一部分):

@"[(]'s*(?<numbers>'d+)'s*(?:,'s*(?<numbers>'d+)'s*)*[)]"