有没有办法用相同数量的X字符替换子字符串的长度?

时间:2015-06-23 15:45:55

标签: regex perl

我试图将文件中的某些字符串与Perl匹配,并使用正则表达式将其与等量的X字符进行匹配,长度与原始字符串长度相同。 例如,该文件可能包含以下内容:

"the quick brown hello world fox jumps over the world" etc. etc.

和一个字典,例如它的字符串如:"hello world",我之前会加载到数组中。

我希望得到以下结果:

"the quick brown XXXXX XXXXX fox jumps over the world" etc. etc.

3 个答案:

答案 0 :(得分:3)

没有

但是,您的语言可能具有接受回调的正则表达式替换功能。然后你可以做这样的事情:

>>> re.sub(r'o+b', lambda m: 'x' * len(m.group(0)), 'foobar')
'fxxxar'

答案 1 :(得分:1)

您将使用带有/e修饰符的替换表达式替换,以及重复运算符x

代码看起来像这样。 \Q ... \E构造用于转义任何非字母数字字符,以便按字面解释它们而不是正则表达式元字符

use strict;
use warnings;
use 5.010;

my $s = 'the quick brown hello world fox jumps over the world';

my $pattern = 'hello world';

$s =~ s/(\Q$pattern\E)/'X' x length $1/e;

say $s;

输出

the quick brown XXXXXXXXXXX fox jumps over the world

更新

如果你想在替换的字符串中保留空格,那么你需要两个嵌套的表达式替换,比如这个

use strict;
use warnings;
use 5.014;

use Data::Dump;

my $s = 'the quick brown hello world fox jumps over the world';

my $pattern = 'hello world';

$s =~ s{(\Q$pattern\E)}{ s/(\S+)/'x' x length($1)/egr }e;

say $s;

输出

the quick brown xxxxx xxxxx fox jumps over the world

或者,如果您运行的是非常旧版本的Perl(在v5.14之前),那么您需要这个

$s =~ s{(\Q$pattern\E)}{ (my $r = $1) =~ s/(\S+)/'x' x length($1)/eg; $r }e;

答案 2 :(得分:0)

不如ThiefM的回答(Python):

import re
str_to_replace = 'hello world'
print re.sub(str_to_replace, re.sub('\w', 'x', str_to_replace), \
    "the quick brown hello world fox jumps over the world")

# another option 
print "the quick brown hello world fox jumps over the world".replace(str_to_replace, re.sub('\w', 'x', str_to_replace))

<强>输出

the quick brown xxxxx xxxxx fox jumps over the world

@ rubenrp81的PHP解决方案:

<?php
$msg = "the quick brown hello world fox jumps over the world";
$str = "hello world";
$rep = preg_replace("/\w/", "x", $str);
$patt = "/$str/";
$res = preg_replace($patt, $rep, $msg);
echo $res; // prints: "the quick brown xxxxx xxxxx fox jumps over the world"
?>