【发布时间】:2017-03-27 12:19:41
【问题描述】:
我有一个字符串
my $text =
"abc " .
"VVV foo III " . # <- here
"pqr hash def " .
"VVV bar hash baz III " . # <- here
"stu hash ghi " .
"VVV bbb, ccc hash ddd III " . # <- here
"vwx";
在本文中,如果出现在单词VVV 和III 之间,我想替换单词hash。用于替换的潜在片段在上面的 sn-p 中用<- here 标记。第一个片段没有单词hash,因此不能在那里进行替换。
我想出了以下正则表达式:
$text =~ s/ VVV (.(?!III))*? hash (.*?)(?=III)/ VVV $1 HASH $2/g;
有了这个正则表达式,$text 就变成了
abc VVV foo III pqr hash def VVV r HASH baz III stu hash ghi VVV c HASH ddd III vwx
替换是在正确的位置进行的,然而,hash 之前的文本仅替换为一个字符(VVV r HASH 而不是 VVV bar HASH 和 VVV c HASH 而不是 @987654335 @)。
我不明白为什么会这样。据我了解正则表达式,VVV 应该充当锚,从而确保匹配它之后的每个字符。
【问题讨论】:
-
我认为你需要使用
VVV ((?:(?!III).)*?) hash (.*?)(?=III)模式。甚至VVV ((?:(?!VVV|III).)*?) hash (.*?)(?=III) -
您提出的模式似乎确实有效。
-
这看起来有点像XY problem - 你到底想完成什么?