2

大きな段落 (特定の文字数を超える) を見つけてスパンにラップしようとしています。現在、私はこれをやっています:

output.replace(/(\n{2}|^)([^\n{2}]{500,})(\n{2}|$)/mg, '$1<span class="warning-big-paragraph">$2</span>$3');

マークダウンの段落は、2 つの改行で区切られます。

問題は、次のようなサンプル データでテストするときです。

text text text text [500 other chars]

text text text text [300 other chars]
text text text text [300 other chars]

2 番目の段落は折り返されません。

4

2 に答える 2

2

この部分[^\n{2}]{500,}は、あなたが思っていることをしません。改行、、、、または回を除く 500 文字以上の任意の文字に一致{2ます}。これを試して:

var pattern = /(\n{2}|^)((?:[^\n]|[^\n]\n[^\n]){500,})(\n{2}|$)/mg

これは、改行文字のペアまたは文字列の先頭に一致し、その後に 500 個以上の非改行文字または他の改行文字に隣接していない改行文字が続き、その後に改行文字のペアまたは文字列の終わり。

しかし、ここにはまだいくつかの問題があります。

  1. 前に単一の改行がある場合は最初の段落に一致しません。また、単一の改行がある場合は最後の段落に一致しません。
  2. 前の一致は 2 つの改行で終わり、次の一致は 2 つの改行で始まるため、2 つの連続する長い段落の間に 4 つの改行が必要になります。

このパターンは、次の 2 つの問題に対処します。

var pattern = /(\n{2}|^\n|^)((?:[^\n]|[^\n]\n[^\n]){500,})(?=\n{2}|\n$|$)/mg

これは、改行文字のペア、文字列の先頭と 1 つの改行文字、または文字列の先頭の後に 500 個以上の非改行文字または隣接していない改行文字に一致します。改行文字の後に改行文字のペア、単一の改行文字と文字列の末尾、または文字列の末尾が続きます。最後の部分は先読みアサーションであるため、一致の一部として含まれません。つまり、2 つの連続した一致の場合、前の一致の条件と次の一致の一部として使用できます。

ここでテストできます。

于 2013-08-07T12:57:07.837 に答える
1

常に力ずくのアプローチがあります。

output = output.split("\n\n").map(function(para) {
    return (para.length > 500
        ? ('<div class="warning-big-paragraph">' + para + '</div>')
        : para);
}).join("\n\n");

実例| ライブソース

注:Array#map一部のブラウザー (特に IE8 以前) では「shim」が必要な ES5 を使用します。「ES5 shim」を検索すると、いくつかのオプションが見つかります。

または退屈な昔ながらの方法:

var paras;
var index;
var para;
paras = output.split("\n\n");
for (index = 0; index < paras.length; ++index) {
    para = paras[index];
    if (para.length > 500) {
        paras[index] = '<div class="warning-big-paragraph">' + para + '</div>';
    }
}
output = paras.join("\n\n");

実例| ライブソース

于 2013-08-07T13:12:03.303 に答える