私は文字列に苦労しています:
"some text [2string] some another[test] and another [4]";
[] 内の数値以外のすべての値を引用しようとするため、次のように変換できます。
"some text ['2string'] some another['test'] and another [4]"
ありがとう。
私は文字列に苦労しています:
"some text [2string] some another[test] and another [4]";
[] 内の数値以外のすべての値を引用しようとするため、次のように変換できます。
"some text ['2string'] some another['test'] and another [4]"
ありがとう。
正規表現が必要です
[]
の間のコンテンツに一致し[
ます]
。]
これは、文字クラスと否定先読みアサーションを使用して解決できます。
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 ]
この正規表現に置き換えることができます
input.replace(/(?!\d+\])(\w+)(?=\])/g, "'$1'");
パフォーマンスが大きな問題ではない場合、より長く、しかし 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]
のようなものを試してみます\[(\d*?[a-z]\w*?)]
。[...]
これは、少なくとも 1 つの文字が含まれている限り、すべてに一致する必要があります。アンダースコア ( _
) が有効でない場合は\w
、末尾の をに置き換え[a-z]
ます。
\[
は の単純な一致で[
あり、 の特別な意味のためにエスケープする必要があり[
ます。\d*?
任意の桁数 (またはなし) に一致しますが、一致を満たすために可能な限り少ない桁数に一致します。[a-z]
指定された範囲内の任意の文字に一致します。\w*?
は、任意の「単語」(英数字) 文字 (文字、数字、およびアンダースコア) と一致しますが、一致を満たすために可能な限り少なくします。]
は別の単純な一致です。これは誤解を招くものではないため、エスケープする必要はありません ([
このレベルではオープンではありません)。エスケープすることもできますが、これは通常、スタイル設定です (実際の正規表現エンジンによって異なります)。あなたの試みに単純な正規表現を追加する別のソリューション:
str.split('[').join("['").split(']').join("']").replace(/\['(\d+)'\]/, "[$1]");