如何在正则表达式中使用量化器通过重复模式获取组
Howto get groups by repeated pattern with qantizer in regular expression
我有以下字符串:
(a,b,c,d,e)
我想用正则表达式找出所有逗号分隔的值。
如果我把括号收起来
a,b,c,d,e
并使用以下正则表达式:
([^,]),?
我为每个逗号分隔值找出一个匹配项和一组。
但是如果我想使用正则表达式处理结束括号:
\((([^,]),?)+\)
我仍然只得到一场比赛和一组。该组仅包含最后一个逗号分隔值。
我也尝试过像这样的组捕获:
(?:....)
(...?)
(...)?
但我无法通过正则表达式组获取逗号分隔值。
当逗号分隔值括在方括号中时,我该怎么做?
通常这就是重复组的工作方式 - 您没有单独的组,只有最后一个。如果您想在逗号之间分隔值,最好使用您的编程语言中可用的字符串函数来先去除括号,然后在逗号上拆分字符串。
例如 Ruby:
[10] pry(main)> '(a,b,c,d,e,f)'.gsub(/[()]/,'').split(',')
# => ["a", "b", "c", "d", "e", "f"]
我发现了。使用 C#,您可以使用匹配集合中的 属性 捕获。
使用正则表达式:
\((([^,]),?)+\)
做:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\((([^,]),?)+\)");
MatchCollection matches = rgx.Matches(text);
然后你有 1 个项目在 matchcollection 中包含以下 3 个组:
[0]: \((([^,]),?)+\) => (a,b,c,d,e)
[1]: ([^,]),?+ => value and optional comma, eg. a, or b, or e
[2]: [^,] => value only, eg. a or b or ...
组内的列表捕获存储量化器提取的每个值。所以使用组 [2] 并捕获以获取所有值。
所以解决方案是:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\((([^,]),?)+\)");
MatchCollection matches = rgx.Matches(text);
//now get out the captured calues
CaptureCollection captures = matches[0].Groups[2].Captures;
//and extract them to list
List<string> values = new List<string>();
foreach (Capture capture in captures)
{
values.Add(capture.Value);
}
我有以下字符串:
(a,b,c,d,e)
我想用正则表达式找出所有逗号分隔的值。
如果我把括号收起来
a,b,c,d,e
并使用以下正则表达式:
([^,]),?
我为每个逗号分隔值找出一个匹配项和一组。
但是如果我想使用正则表达式处理结束括号:
\((([^,]),?)+\)
我仍然只得到一场比赛和一组。该组仅包含最后一个逗号分隔值。
我也尝试过像这样的组捕获:
(?:....)
(...?)
(...)?
但我无法通过正则表达式组获取逗号分隔值。
当逗号分隔值括在方括号中时,我该怎么做?
通常这就是重复组的工作方式 - 您没有单独的组,只有最后一个。如果您想在逗号之间分隔值,最好使用您的编程语言中可用的字符串函数来先去除括号,然后在逗号上拆分字符串。
例如 Ruby:
[10] pry(main)> '(a,b,c,d,e,f)'.gsub(/[()]/,'').split(',')
# => ["a", "b", "c", "d", "e", "f"]
我发现了。使用 C#,您可以使用匹配集合中的 属性 捕获。
使用正则表达式:
\((([^,]),?)+\)
做:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\((([^,]),?)+\)");
MatchCollection matches = rgx.Matches(text);
然后你有 1 个项目在 matchcollection 中包含以下 3 个组:
[0]: \((([^,]),?)+\) => (a,b,c,d,e)
[1]: ([^,]),?+ => value and optional comma, eg. a, or b, or e
[2]: [^,] => value only, eg. a or b or ...
组内的列表捕获存储量化器提取的每个值。所以使用组 [2] 并捕获以获取所有值。
所以解决方案是:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\((([^,]),?)+\)");
MatchCollection matches = rgx.Matches(text);
//now get out the captured calues
CaptureCollection captures = matches[0].Groups[2].Captures;
//and extract them to list
List<string> values = new List<string>();
foreach (Capture capture in captures)
{
values.Add(capture.Value);
}