2

私は文字列に苦労しています:

"some text [2string] some another[test] and another [4]";

[] 内の数値以外のすべての値を引用しようとするため、次のように変換できます。

"some text ['2string'] some another['test'] and another [4]"

ありがとう。

4

5 に答える 5

4

正規表現が必要です

  • []の間のコンテンツに一致し[ます]]
  • は、ここに数字以外に少なくとも 1 つの文字があることを表明します。

これは、文字クラス否定先読みアサーションを使用して解決できます。

result = subject.replace(/\[(?!\d+\])([^\]]*)\]/g, "['$1']");

説明:

\[      # Match [
(?!     # Assert that it's impossible to match...
 \d+    # one or more digits
 \]     # followed by ]
)       # End of lookahead assertion
(       # Match and capture in group number 1:
 [^\]]* # any number of characters except ]
)       # End of capturing group
\]      # Match ]
于 2013-06-24T08:39:00.563 に答える
0

この正規表現に置き換えることができます

input.replace(/(?!\d+\])(\w+)(?=\])/g, "'$1'");
于 2013-06-24T08:50:08.263 に答える
0

パフォーマンスが大きな問題ではない場合、より長く、しかし IMO よりクリーンなアプローチ:

var string = "some text [2string] some another[test] and another [4]";
var output =  string.replace(/(\[)(.*?)(\])/g, function(match, a, b, c) {
  if(/^\d+$/.test(b)) {
    return match;
  } else {
    return a + "'" + b + "'" + c;
  }
});
console.log(output);

基本的に、角括弧内のすべての式を照合し、それが数値かどうかをテストします。そうである場合は、文字列をそのまま返します。そうでない場合は、特定の場所に引用符を挿入します。

出力:

some text ['2string'] some another['test'] and another [4]
于 2013-06-24T08:40:57.573 に答える
0

のようなものを試してみます\[(\d*?[a-z]\w*?)][...]これは、少なくとも 1 つの文字が含まれている限り、すべてに一致する必要があります。アンダースコア ( _) が有効でない場合は\w、末尾の をに置き換え[a-z]ます。

  • \[は の単純な一致で[あり、 の特別な意味のためにエスケープする必要があり[ます。
  • \d*?任意の桁数 (またはなし) に一致しますが、一致を満たすために可能な限り少ない桁数に一致します。
  • [a-z]指定された範囲内の任意の文字に一致します。
  • \w*?は、任意の「単語」(英数字) 文字 (文字、数字、およびアンダースコア) と一致しますが、一致を満たすために可能な限り少なくします。
  • ]は別の単純な一致です。これは誤解を招くものではないため、エスケープする必要はありません ([このレベルではオープンではありません)。エスケープすることもできますが、これは通常、スタイル設定です (実際の正規表現エンジンによって異なります)。
于 2013-06-24T08:37:39.137 に答える
0

あなたの試みに単純な正規表現を追加する別のソリューション:

str.split('[').join("['").split(']').join("']").replace(/\['(\d+)'\]/, "[$1]");
于 2013-06-24T09:00:02.703 に答える