使用 Perl 拆分功能保留(捕获)一些分隔符并丢弃其他分隔符

-1 regex perl

假设我正在使用 Perl 的 split 函数来拆分文件的内容。

例如:

这个 foo 文件有+一堆;(随机)“那个”地方的东西

所以假设我想使用空格和分号作为分隔符。

所以我会使用类似的东西:

split(/([\s+\;])/, $fooString)
Run Code Online (Sandbox Code Playgroud)

我无法找出一种语法(或者即使它存在)来捕获分号并丢弃空格。

zdi*_*dim 5

你似乎要求类似的东西

my @fields_and_delim = split /\s+|(;)/, $string;  # not quite right
Run Code Online (Sandbox Code Playgroud)

但这并不完全是它看起来的样子。它还返回空元素(带有警告),因为\s+匹配时()不会捕获任何内容,但$1仍按要求返回,并且它是undef. 当您的分隔符在字符串中组合在一起时,还有更多虚假匹配。

所以过滤

my @fields_and_delim = grep { defined and /\S/ } split /(\s+|;)/, $string;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您通常可以捕获分隔符。


这也可以用正则表达式来完成

my @fields_and_delim = $string =~ /([^\s;]+|;+)/g;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它可以更好地控制您从字符串中选择的内容和方式。

如果重复;需要单独捕获更改;+;