RegEx与分组分开

时间:2014-02-27 21:31:31

标签: regex perl powershell split

使用分组操作分组是否有一些警告?

在perl:

print join("|",split(m/(A|AND)/,"foo A bar"))."\n";

预期:

foo | bar

输出:

foo |A| bar

Powershell的预期/输出相同:

([regex]::Split("foo A bar","(A|AND)"))-join"|"

似乎在使用分组时出现问题 - 没有括号一切都很好:

([regex]::Split("foo A bar","A|B"))-join"|"

输出符合预期:

foo | bar

但是当我引入分组以便能够使用多字符替换(用填充字符环绕 - “\ s(A | AND)\ s”)时,分割开始意外地表现。

分裂实际上在做什么 - 正在执行什么样的拆分?为什么分裂我可能不会被执行?我有什么选择?

1 个答案:

答案 0 :(得分:4)

使用非捕获括号分割正则表达式(?:..)

print join("|",split(m/(?:A|AND)/,"foo A bar"))."\n";

来自perldoc

  

如果PATTERN包含捕获组,则对于每个分隔符,将为组捕获的每个子字符串生成一个附加字段(按照指定组的顺序,根据后向引用);如果任何组不匹配,则它捕获undef值而不是子串。

同样适用于PowerShell(或更确切地说.Net)。来自documentation

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“plum-pear”,则返回的数组包含一个包含连字符的字符串元素。