大佬教程收集整理的这篇文章主要介绍了regex – Perl用字符串中的“x”替换数字,但仅在一个特定位置,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Error 123: Customer 2: Bad Date [17/12/2014] Error 123: Customer 2: Bad Date [19/12/2014] Error 123: Customer 1: Bad Date [123/23/222] Error 123: Customer 2: Bad Date [null] Error 123: Customer 6: Bad Date [12/14:] Error 123: Customer 6: Bad Date [12/16:]
现在,前两个对同一个客户来说真的是同一个错误.这两行,日期报告为DD / MM / YYYY而不是YYYY / MM / DD,所以我不需要两次报告此错误.最后两行对于同一客户也是同样的错误.使用过的MM / DD并离开了当年.即使我之前报告过客户#2的错误日期错误,空日期也是另一个错误.在某个地方,他们正在通过一个空日期.
我想做的是用这种方式比较线条:
Error 123: Customer 2: Bad Date [xx/xx/xxxx] Error 123: Customer 2: Bad Date [xx/xx/xxxx] Error 123: Customer 1: Bad Date [xxx/xx/xxx] Error 123: Customer 2: Bad Date [null] Error 123: Customer 6: Bad Date [xx/xx:] Error 123: Customer 6: Bad Date [xx/xx:]
现在,很容易看出前两行和后两行真的是同一个错误.问题是如何使用正则表达式执行此操作.我想更改[和]到x之间的所有数字,但我不想触及字符串的其余部分,因此我不想将错误或客户编号转换为x.
我第一次尝试:
$error =~ s/(\[.*?)\d/$1x/g;
但这只触及括号中的第一个数字.我已经尝试过没有非贪婪的限定符,但这只涉及最后一个角色.
我可以这样做:
$error =~ s/\d/x/g;
但是,用X取代所有出现的数字会破坏我的错误号和客户号.
我可以一遍又一遍地传递错误行,直到没有更换:
while ( my $error = <DATA> ) { chomp $error; while ( $error =~ s/(\[.*?)\d/$1x/ ) { 1; } say qq(Error: "$error"); }
但是必须有一种方法可以做到这一点,而不必多次遍历while循环.
有没有办法用X有效地替换所有出现的数字,但只能在两个方括号之间?
$error =~ s{(\[ [^\]]+ \])}{ (my $date = $1) =~ tr/0-9/x/; $date; }ex;
如果没有可重入的正则表达式引擎,这将无法在旧的perls中使用.显然,我错了.我用新鲜的brewed perl 5.10.1尝试了这个代码,它运行得很好.
或者,您可以滥用左值子句:
if ($error =~ /\[/gC) { my $start = pos $error; my $length = index($error,']',$start) - $start; substr($error,$start,$length) =~ tr/0-9/x/; }
以上是大佬教程为你收集整理的regex – Perl用字符串中的“x”替换数字,但仅在一个特定位置全部内容,希望文章能够帮你解决regex – Perl用字符串中的“x”替换数字,但仅在一个特定位置所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。