2

我正在寻找如何更改花哨的引号的方法:"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 层。


注意!在单独的替换中更改 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»
4

2 回答 2

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»
于 2013-02-17T12:42:48.477 回答
2

您可以使用否定的环视断言来找到您花哨的报价的匹配方向。双重否定有助于处理边缘情况(例如行的结束/开始)。为简单起见,我在这里使用<<and>>而不是您花哨的报价。

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>>
于 2013-02-17T12:44:54.550 回答