22

Javascriptベースのルールエンジンを使用するアプリケーションがあります。通常のストレートクォートをカーリー(またはスマート)クォートに変換する方法が必要です。string.replaceforを実行するのは簡単ですが["]、これだけが中引用符の1つのケースのみを挿入します。

私が考えることができる最善の方法は、引用符の最初の出現を左のカーリー引用符に置き換え、その後に続くすべての引用符を左に、残りを右のカーリーに置き換えることでした。

Javascriptを使用してこれを達成する方法はありますか?

4

7 に答える 7

16

単語文字の前にあるすべてを左引用符に置き換え、単語文字に続くすべてを右引用符に置き換えることができます。

str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "&#8221;"); // IF the language supports look-
                                             // behind. Otherwise, see below.

以下のコメントで指摘されているように、これは句読点を考慮していませんが、簡単に次のことができます。

/(?<=[\w,.?!\)]|^)"/g

[編集:] Javascript のような後読みをサポートしない言語の場合、最初にすべての前面のものを置き換える限り、次の 2 つのオプションがあります。

str = str.replace(/"/g, "&#8221;"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "&#8221;"); // Replace any quotes after a word
                                      // boundary with right curly quotes

(後読みをサポートする言語を使用している人に役立つ場合に備えて、上記の元のソリューションを残しました)

于 2010-02-04T20:13:59.910 に答える
5

Pandocが何をするか見てみたいと思うかもしれません— どうやらこの--smartオプションを使うと、すべての場合 (たとえば 'tis と 'twere を含む) で引用符を適切に処理します。

私は最近、特に引用符の置換を行う Javascript のタイポグラフィ整形エンジンを作成しました。私は基本的にRenesisによって提案されたアルゴリズムを使用して終了しましたが、現在、よりスマートなソリューションを待っている失敗したテストがあります。

私のコードをコピーする (および/またはあなたが行った作業に基づいたパッチを提出する) ことに興味がある場合は、それをチェックしてください: jsPrettifyjsprettify.prettifyStrあなたが探していることをします。Closure の依存関係に対処したくない場合は、単独で実行される古いバージョンがあり、Rhino でも動作します。

于 2010-03-25T04:29:03.907 に答える
4
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
    return "“" + m1 + "”";
});
于 2010-02-04T20:12:46.777 に答える
3

以下は、すべての引用符を交互に変更するだけです (ただし、この特定の例では、孤立した引用符が除外されます)。

str.replace(/\"([^\"]*)\"/gi,"&#8220;$1&#8221;");

テクスチャリングしているテキストが二重引用符の不適切な使用で台無しにされていない限り、完全に機能します。英語では、引用符が入れ子になることはありません。

于 2010-11-29T04:43:33.777 に答える
0

後世のために投稿。

@Steven Dee が提案したように、私はPandocに行きました。

独自の正規表現を作成するのではなく、できる限り成熟したテスト済みのツールを使用するようにしています。手作りの正規表現は貪欲すぎるか、貪欲さが足りない可能性があり、単語の境界やコンマなどに敏感ではない可能性があります。

コマンド ラインから ( --smart パラメータはスマート クォートを有効にします):

pandoc --smart --standalone -o output.html input.html

..そして、コマンドラインスクリプトがJavascriptを使用するというOPの要件に適合する場合と適合しない場合があることを知っています。(関連:Javascriptでシェルコマンドを実行する方法

于 2016-02-27T14:36:20.073 に答える
0

コンテンツ内の各二重引用符の意味を正確に解釈する必要があるため、一般的にそのようなことは簡単ではないと思います。そうは言っても、興味のあるすべてのテキストノードを収集してから、各二重引用符インスタンスの「オン/オフ」(または「奇数/偶数」など) の性質を調べて追跡します。次に、使用する代替エンティティを知ることができます。

于 2010-02-04T20:15:32.340 に答える
0

ここで必要なロジックが見つからなかったので、最終的には次のようになりました。

value = value.replace(/(^|\s)(")/g, "$1“"); // replace quotes that start a line or follow spaces
value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote

まっすぐな引用符をカーリー (スマート) 引用符に置き換える必要がある小さなテキストエリアがあります。キーアップでこのロジックを実行しているだけです。Microsoft Word のように動作するようにしました。

于 2014-12-12T18:03:55.963 に答える