use*_*092 23 regex perl replace
我怎样才能调换字母o与字母e和e用o?
我刚试过这个,但我不认为这是一个很好的方法.有没有更好的办法?
my $str = 'Absolute force';
$str =~ s/e/___eee___/g;
$str =~ s/o/e/g;
$str =~ s/___eee___/o/g;
Run Code Online (Sandbox Code Playgroud)
输出: Abseluto ferco
Adr*_*rth 25
使用音译操作符:
$str =~ y/oe/eo/;
Run Code Online (Sandbox Code Playgroud)
例如
$ echo "Absolute force" | perl -pe 'y/oe/eo/'
Abseluto ferco
Run Code Online (Sandbox Code Playgroud)
正如已经说过的那样,做到这一点的方法是 transliteration operator
tr/SEARCHLIST/REPLACEMENTLIST/cdsr
y/SEARCHLIST/REPLACEMENTLIST/cdsr使用替换列表中的相应字符音译搜索列表中找到的所有出现的字符.它返回替换或删除的字符数.如果没有通过
=~or!~运算符指定字符串,则表示$_字符串已音译.
但是,我想赞扬您对正则表达式的创造性使用.您的解决方案有效,尽管占位符字符串_ee_已经足够了.
tr虽然只会帮助你进行角色替换,所以我想快速教你如何利用正则表达式进行更复杂的质量替换.基本上,您只需使用/e标记在RHS中执行代码.以下还将进行您的目标替换:
my $str = 'Absolute force';
$str =~ s/([eo])/$1 eq 'e' ? 'o' : 'e'/eg;
print $str;
Run Code Online (Sandbox Code Playgroud)
输出:
Abseluto ferco
Run Code Online (Sandbox Code Playgroud)
注意LHS(左侧)如何同时匹配o和e,和他们RHS(右手边)做试验,看看哪些匹配,返回对面进行更换.
现在,通常会有一个要替换的单词列表,因此只需构建from/to值的哈希值然后动态构建正则表达式就很方便了.以下是这样的:
my $str = 'Hello, foo. How about baz? Never forget bar.';
my %words = (
foo => 'bar',
bar => 'baz',
baz => 'foo',
);
my $wordlist_re = '(?:' . join('|', map quotemeta, keys %words) . ')';
$str =~ s/\b($wordlist_re)\b/$words{$1}/eg;
Run Code Online (Sandbox Code Playgroud)
输出:
Hello, bar. How about foo? Never forget baz.
Run Code Online (Sandbox Code Playgroud)
上面的内容也适用于你e和你的o情况,但是一直都是矫枉过正的.注意我如何使用它quotemeta来转义键,以防它们包含正则表达式特殊字符.我还故意在它们周围使用非捕获组,$wordlist_re以便变量可以放入任何正则表达式并按照需要运行.然后我把捕获组放在里面,s///因为能够看到正则表达式中捕获的内容非常重要,而不必回溯到插值变量的值.