我需要从这样的字符串中提取用逗号分隔的数字(具有任意数量的数字和空格):
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
我需要从这样的字符串中提取用逗号分隔的数字(具有任意数量的数字和空格):
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,number2,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*)*[)]"