加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl正则表达式

发布时间:2020-12-16 06:17:28 所属栏目:大数据 来源:网络整理
导读:我继承了一个从一些文件中提取数据的perl脚本.整个脚本工作正常,但最近一些工程师已经为一个通常占用一个数字的某个位置输入了多个数字,因此输出没有显示预期的全部内容. 样本输入: CRXXXX:“然后一些文字” CR XXXX,XXXX,XX,XXX CRXXX“一些文字” 目前这
我继承了一个从一些文件中提取数据的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/(,)|[^dn]+/$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),(?=sd)//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

但实际上,如果可能的话,请使用更简单的两步法.后者正则表达可能是你继任者的维持噩梦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读