连续正则表达式替换分离的值

时间:2014-01-18 01:34:46

标签: regex arrays perl datagrid replace

将栅格网格文件读入包含任意数字的@grid,例如

82 8 98 98 42 12 3342 321 34 34 09434 9232

(以及更多这些行)。

在这里,我想更换一些数字,比如34和42。 但只有单个,分开的数字!例如。我不想替换3342中的34。

因此对于数字$ a(搜索,例如34)和$ b(替换,例如42),我的方法是

s/(^|\s)$a(\s|$)/$1$b$2/g for @grid;

但这仅替换连续出现的每一秒(例如34 34 34 34 =&gt; 42 34 42 34),因为后缀\s不会被考虑作为下一个模式的前缀。< / p>

这个问题有没有解决办法,除了将两个命令背对背(对于大型阵列来说速度慢)?

2 个答案:

答案 0 :(得分:2)

你正在寻找\b:单词char(\ w)和不是单词char

之间的边界
s/\b$a\b/$b/g

Live DEMO

答案 1 :(得分:0)

您可以设置包含替换对的哈希值,然后捕获一行上的每个数字,并在该数字为哈希键时进行替换:

use strict;
use warnings;

my %replacements = ( 34 => 42, 8 => 100 );

while (<DATA>) {
    s/(\d+)/exists $replacements{$1} ? $replacements{$1} : $1/ge;
    print;
}

__DATA__
82 8 98 98 42 12 3342 321 34 34 09434 9232
97 8 8 8 27 37 34 55 19 100 8 34 07932 8

输出:

82 100 98 98 42 12 3342 321 42 42 09434 9232
97 100 100 100 27 37 42 55 19 100 100 42 07932 100

希望这有帮助!