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

正規表現が1番目と3番目の引用に一致し、それらを変更することを望みました。そして、そうです。問題は次のとおりです。2 番目と 4 番目が再び一致することを望んでいましたが、2 番目がすでに取り残されているため、一致しません。1 つの解決策は、引用文字が 2 未満になるまで同じ置換を再度実行することです。

私の目標を達成するためのより良い方法はありますか? 3 番目のレベルのネストがある場合、私のアプローチは機能しません。これは私の目標ではありません。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

否定的なルックアラウンド アサーションを使用して、ファンシー クォートに一致する方向を見つけることができます。二重否定は、特殊なケース (行末/行頭など) の処理に役立ちます。簡単にするために、ここでは派手な引用の代わりに<<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 に答える
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 に答える