使用Perl split函数来保留(捕获)一些分隔符并丢弃其他分隔符

时间:2018-02-06 19:08:54

标签: regex perl

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

例如:

This foo file has+ a bunch of; (random) things all over "the" place

因此,假设我想使用空格和分号作为分隔符。

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

split(/([\s+\;])/, $fooString)

我无法弄清楚语法(或者即使它存在)来捕获分号并丢弃空格。

3 个答案:

答案 0 :(得分:4)

你似乎要求像

这样的东西
my @fields_and_delim = split /\s+|(;)/, $string;  # not quite right

但这并不是它看起来的样子。它还会返回空元素(带有警告),因为当\s+匹配时,()只会捕获$1,但仍会按要求返回undef,而my @fields_and_delim = grep { defined and /\S/ } split /(\s+|;)/, $string; 。当你的分隔符聚集在字符串中时,还有更多的虚假匹配。

所以过滤

my @fields_and_delim = $string =~ /([^\s;]+|;+)/g;

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

这也可以使用正则表达式

完成
;

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

如果需要单独捕获重复的;+,请将;更改为{{1}}

答案 1 :(得分:0)

我认为你想要的就像:

submitButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent submit) {
        String[] selectedUniversities = uniList.getSelectedValuesList().toArray(new String[] {});
    }
});

这将在split /\s*;\s*/, $fooString; 字符周围分开,该字符可能会或可能不会在之前或之后有任何空格。

在你的例子中:

;

它会分成:

>This foo file has+ a bunch of; (random) things all over "the" place<

>This foo file has+ a bunch of<

顺便说一句,您需要将>(random) things all over "the" place< 的结果放入数组中;例如:

split

然后my @parts = split /\s*;\s*/, $fooString; $parts[0]会有两位。

答案 2 :(得分:0)

我认为grep正是您真正想要的,过滤列表中不是所有空格的值:

my @all_exc_ws = grep {!/^\s+$/} split(/([\s\;])/, $fooString);

此外,我从你的正则表达式中删除了+,因为它位于[]内,这改变了它的含义。