我正在寻找如何更改花哨的引号:"abc"
- > «abc»
。
它适用于我在简单的情况下,我正在寻找的下一步是如何使用嵌套引号:"abc "d e f" ghi"
- > «abc «d e f» ghi»
$pk =~ s/
"( # first qoute, start capture
[\p{Word}\.]+? # at least one word-char or point
.*?\b[\.,?!]*? # any char followed boundary + opt. punctuation
)" # stop capture, ending quote
/«$1»/xg; # change to fancy
我希望正则表达式匹配第一和第三个引用并更改它们。确实如此。问题是:我希望然后再次匹配第2和第4,但它不会,因为第2已经落后了。一种解决方案是再次运行相同的替换,直到少于2个引用字符。
有没有更好的方法来实现我的目标?当有第三级嵌套时我的方法不起作用,这不是我的目标,我保持2级。
NB!更改startquote和enquote在单独的替换中不会起作用,因为那样单个双引号也会被替换。我只有当他们看起来像夫妻时才需要更换!
更多例子:
"abc "d e f" -> «abc "d e f»
"abc"d e f" -> «abc"d e f»
这似乎不可能:
"abc" d e f" -> «abc" d e f»
答案 0 :(得分:2)
没有通用的方法来配对嵌套的双引号。如果您的引号始终位于单词的开头或结尾,那么这可能有效。它取代了带有开放引号的非空格字符前面的双引号,以及带有近引号的非空格字符的双引号。
use strict;
use warnings;
use utf8;
my $string = '"abc "d e f" ghi"';
$string =~ s/"(?=\S)/«/g;
$string =~ s/(?<=\S)"/»/g;
print $string;
<强>输出强>
«abc «d e f» ghi»
答案 1 :(得分:2)
您可以使用否定的外观断言来查找您的花哨引号上的匹配方向。双重否定有助于处理边缘情况(例如,行的结束/开始)。为简单起见,我使用<<
和>>
代替了您的花哨引号。
use strict;
use warnings;
while (<DATA>) {
s/(?<!\S)"(?!\s)/<</g;
s/(?<!\s)"(?!\S)/>>/g;
print;
}
__DATA__
"abc "d e f" ghi"
<强>输出:强>
<<abc <<d e f>> ghi>>