Perl在多次出现相同模式时分裂

时间:2014-12-26 10:31:24

标签: regex perl

我编写了以下Perl脚本来分割多次出现的相同模式。

模式是:(某些文字)

这是我尝试过的:

foreach my $line (@input) {

  if ($line =~ /(\(.*\))+/g) {

    my @splitted = split(/(\(.*\))/, $line);

    foreach my $data (@splitted) {
      print $data, "\n";
    }
  }
}

对于给定的输入文本:

Non-rapid eye movement sleep (NREMS).
Cytokines such as interleukin-1 (IL-1), tumor necrosis factor, acidic fibroblast growth factor (FGF), and interferon-alpha (IFN-alpha).

我得到以下输出:

Non-rapid eye movement sleep
(NREMS).
Cytokines such as interleukin-1
(IL-1), tumor necrosis factor, acidic fibroblast growth factor (FGF), and interferon-alpha (IFN-alpha).

代码不会在文本第2行中第二次和第三次出现的文本上拆分文本。我无法弄清楚我做错了什么。

3 个答案:

答案 0 :(得分:3)

(\([^(]*\))

由此分裂。你的正则表达式是贪婪的。或者让它不贪婪。(\(.*?\))

参见演示。

https://regex101.com/r/dU7oN5/14

你的正则表达式问题可以在这里看到https://regex101.com/r/dU7oN5/15

你的正则表达式与(匹配,然后贪婪地寻找最后的),而不是它遇到的第一个)。所以最后一行被捕获了。

答案 1 :(得分:2)

您尚未描述目的,但我建议您使用正则表达式匹配而不是split。但看起来你正在处理自由格式的文本,这在一般情况下永远不会正常工作。

该程序在输入数据中找到所有文本(和括号内的含义)。

use strict;
use warnings;

while (<DATA>) {
  while ( / ( [^()]* ) \( ( [^()]* ) \) /xg ) {
    my ($defn, $abbr) = ($1, $2);
    print "$defn\n";
    print "-- $abbr\n\n";
  }
}

__DATA__
Non-rapid eye movement sleep (NREMS).
Cytokines such as interleukin-1 (IL-1), tumor necrosis factor, acidic fibroblast growth factor (FGF), and interferon-alpha (IFN-alpha).

<强>输出

Non-rapid eye movement sleep 
-- NREMS

Cytokines such as interleukin-1 
-- IL-1

, tumor necrosis factor, acidic fibroblast growth factor 
-- FGF

, and interferon-alpha 
-- IFN-alpha

答案 2 :(得分:1)

尝试使用:

foreach my $line (@input) {
    if($line =~/\(.*\)/) { # modifier g can be removed here
        my @splitted = split(/(\(.+?\))/, $line); # make the match non greedy
        foreach my $data (@splitted) { 
            print $data, "\n"; 
        }
    }
}