如何更改嵌套引号?

时间:2013-02-17 12:25:27

标签: regex perl

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

2 个答案:

答案 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>>