【问题标题】:RegEx split with groupingRegEx 分组拆分
【发布时间】:2014-02-27 21:31:31
【问题描述】:

将分组与拆分操作一起使用是否有一些注意事项?

在 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”)时,拆分开始出现意外行为。

这里的拆分实际上是做什么的——正在执行什么样的拆分?为什么没有执行我可能期望的拆分?我的替代方案是什么?

【问题讨论】:

  • 是的,捕获组在捕获的数据数组中生成一个元素。使用(?:A|B) 消除分隔符。拥有这种能力虽然是非常强大的。例如,您可以同时过滤和拆分。

标签: regex perl powershell split


【解决方案1】:

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

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

来自perldoc

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

PowerShell(或者更确切地说是 .Net)也是如此。来自documentation

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

【讨论】:

  • 谢谢!我不敢相信我不知道非捕获括号!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多