我正在测试Jeffrey Friedl的"掌握正则表达式"中的一个例子.我不明白他给出了展示未来/后面的"commafication"例子:
my $test1 = "the new york lotto jackpot is now 1856000 dollars";
my $test2 = "the new york lotto jackpot is now 1856000 dollars";
print "original statement: $test1\n";
$test1 =~ s/(?<=\d)(?=(\d\d\d)+)/,/g;
print "test 1: $test1\n";
$test2 =~ s/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g;
print "test 2: $test2\n";
Run Code Online (Sandbox Code Playgroud)
结果:
original statement: the new york lotto jackpot is now 1856000 dollars
test 1: the new york lotto jackpot is now 1,8,5,6,000 dollars
test 2: the new york lotto jackpot is now 1,856,000 dollars
Run Code Online (Sandbox Code Playgroud)
正则表达式的目标是每3位数字插入一个逗号.
我不理解角色(?!\d)扮演,为什么在没有它的表达中,前瞻组重叠.
第一个正则表达式查找那些字符串中的点前面的数字,并随后由三位数字的倍数.
因此1856000,在数字之前的第一个点就在数字之后1.然后检查后跟三位数的倍数也是成功的,因为有856和000,所以插入了逗号.
下一个以数字开头的点就在数字之后8,但问题是检查三位数560的倍数,因为是三位数的倍数,它紧跟在字符串中的这一点之后.所以这里插入的另一个逗号不正确.
测试应指定该点后面只有三位数的倍数,因此三位数后跟另外两位备用数字不计算.
这是通过坚持三胞胎不跟随另一个数字来完成的,这是另一个数字(?!\d).现在,恰好在8数字之前的点后跟一个三元组,但是在三元组之后的字符是另一个数字0,因此模式在之后的点之后不匹配6,后面有一个三元组,并且之后没有数字.
我希望这有帮助
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |