我继承了一个从一些文件中提取数据的perl脚本.整个脚本工作正常,但最近一些工程师已经为一个通常占用一个数字的某个位置输入了多个数字,因此输出没有显示预期的全部内容.
样本输入:
CRXXXX:“然后一些文字”
CR XXXX,XXXX,XX,XXX
CRXXX“一些文字”
目前这个正则表达式声明我已经在CR之后拉出了数字,但是如果给出了第二行样本输入它打印“s XXXX,XXX”而不是想要的“XXXX XXXX XX XXX”
我是perl的新手,我正在努力弄清楚如何改变这个正则表达式来处理所有的输入.
$temp_comment =~ s/\s[cC][rR][-\s:;]*([\d])/\n$1/mg;
提前致谢!
獾
解决方法
对于样本数据,例如:
my $temp_comment = 'CR1234: "Then some text" CRs 2345,3456,45,567 CR678 "Some Text"';
尝试:
$temp_comment =~ s/(,)|[^\d\n]+/$1?' ':''/semg;
或者,如果您想要接近字符串模板:
$temp_comment =~ s/ ^ # multi-line mode,line start \s* # leading blanks? CR # CR tag \D* # non-number stuff ( # start capture group (?:\d+ [,\s]*)+ # find (number,comma,space) groups ) # end capture group \D* # skip remaining non-number stuff $ # multi-line mode,line end /$1/mxg; # set multi-line mode + regex comments "x"
但是您必须在后续步骤中删除编号组中的逗号.
$temp_comment =~ tr/,//d; # remove commas in the whole string
要么
$temp_comment =~ s/(?<=\d),(?=\s\d)//g; # remove commas between numbers '11,22'
对于“单步”,您必须使用/ e修饰符:
$temp_comment =~ s{ ^ # line start \s* # leading blanks? CR # CR tag \D* # non-number stuff ((?:\d+ [,\s]*)+) # single or group of numbers \D* # non number stuff $ # line end } {do{(local$_=$1)=~y/,//d;$_}}mxeg;
根据上述数据,这将导致:
1234 2345 3456 45 567 678
但实际上,如果可能的话,请使用更简单的两步法.后者正则表达可能是你继任者的维持噩梦.