我编写了以下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行中第二次和第三次出现的文本上拆分文本。我无法弄清楚我做错了什么。
答案 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";
}
}
}