3

テキストの後にのみ来るすべての引用符をエスケープしたいH1:

例えば、 :

H1: "text here"

なる必要があります:

H1: "text here"

これは後読みで簡単にできますが、JS ではそうではありません。

私が試したこと:

.replace(/H1:(.*)(")(.*)/ig, "H1:$1"$2")

また、次のような他の同様のテキストでも機能するはずです。

H1: ""text here""
H1: "text "here""
H1: ""text here"
4

4 に答える 4

1

テキストを行に分割し、「H1」で始まるすべての行を単純に置換します。

" という点に注意してください。文字が HTML 内に埋め込まれている場合、JavaScript エンジンによって実際の引用符に置き換えられることがあります。(編集:この回答に直接書き込もうとしたときに置き換えられました)。

于 2010-07-20T20:14:31.390 に答える
1

1 つのアプローチを次に示します。

function encodeQuotesOccuringAfter(string, substring) {
    if(string.indexOf(substring) == -1) {
        return string;
    }

    var all = string.split(substring);
    var encoded = [all.shift(), all.join(substring).replace(/"/g, """)];

    return encoded.join(substring)
}

この 2 番目のものは少し無駄ですが、これを関数に移動して、startAt1 回だけ計算することができます。アイデアは、すべての引用符を探して、それらの前に「H1:」があるものだけを変更することです。

str.replace(/"/g, function(match, offset, string) {
    var startAt = string.indexOf("H1:");
    if(startAt != -1 && offset > startAt) {
        return """;
    }
    else {
        return '"';
    }
});

H1:引用符を含まないドメイン知識を使用して、文字列全体を単純に置換します。

str.replace(/"/g, """);
于 2010-07-20T19:50:50.463 に答える
0

これを試して:

.replace(/H1:(.*?)(")(.*?)/ig, "H1:$1"$3")

*? 先行するトークンの 0 個以上に一致します。これは遅延一致であり、次のトークンを満たす前にできるだけ少ない文字と一致します。

これは、正規表現のテストに使用する Web サイトです: http://gskinner.com/RegExr/

于 2010-07-20T20:05:02.087 に答える
0

まず、文字列を行に分割します。次に、正しい行でのみテキストの置換を行い、テキストの置換を行っている間、すべての行を連結して戻します。

<script type="text/javascript">
  // Create a test string.
var string='H1: "text here" \nH1: test "here" \nH2: not "this" one';
  // Split the string into lines
array = string.split('\n');
  // Iterate through each line, doing the replacements and 
  // concatenating everything back together
var newString = "";
for(var i = 0; i < array.length; i++) {
      // only do replacement if line starts H1
      // /m activates multiline mode so that ^ and $ are start & end of each line
    if (array[i].match(/^H1:/m) ) {
          // Change the line and concatenate
          // I used &quote; instead of &quote; so that the changes are
          // visible with document.write
        newString += array[i].replace(/"/g, '&quote;') + '\n';    
    } else {
          // only concatenate
        newString += array[i] + '\n';
    }
}
document.write(newString);
</script>
于 2010-07-20T20:05:23.730 に答える