在这个字符串中
ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<
Run Code Online (Sandbox Code Playgroud)
我想,以取代之间的每个子XY以及<由一个或两个取决于以前的括号字符:
如果XY在(CN)将子字符串替换为之后ONE
如果XY在(CI)将子字符串替换为之后TWO
因此结果应为:
ab<(CN)cdONE<(CI)efgTWO<(CN)zONE<(CI)efgTWO<
Run Code Online (Sandbox Code Playgroud)
XY并且后面的字符应该被替换,而不是尖括号<。
这是用于修改HTML和任意字符之间可以发生XY和<。我想我需要两个正则表达式用于(CN)和(CI)。
# This one replaces just all XY:
my $s = 'ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<';
$s =~ s/(XY(.*?))</ONE/g;
# But how to add the conditions to the regex?
Run Code Online (Sandbox Code Playgroud)
您不需要两个正则表达式。捕获C[NI]并从哈希中检索相应的替换值:
#!/usr/bin/perl
use warnings;
use strict;
my $s = 'ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<';
my %replace = (CN => 'ONE', CI => 'TWO');
$s =~ s/(\((C[NI])\).*?)XY.*?</$1$replace{$2}</g;
my $exp = 'ab<(CN)cdONE<(CI)efgTWO<(CN)zONE<(CI)efgTWO<';
use Test::More tests => 1;
is $s, $exp;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |