2009-07-17 12 views
1

クローンhtml要素のidを変更するための次の式が見つかりました。 contactDetails[0]contactDetails[1]には変更:javascriptを解釈するヘルプRegex

var nel = 1; 
var s = $(this).attr(attribute); 
    s.replace(/([^\[]+)\[0\]/, "$1["+nel+"]"); 
    $(this).attr(attribute, s); 

私は正規表現とひどく慣れていないけど、私はまだ苦労していますが、それを解釈し、The Regex Coachの助けを借りてしようとしています。 ([^\[]+)は、「[」ではない文字と一致し、\[0\]/[0]と一致します。真ん中の/は「両方を含む」と解釈するので、著者が最初の式を含む理由がわからない。

私は置換文字列の$ 1を理解していません。単にRegex Coach置換機能を使用すると、置換として[0]を使用し、置換として1を置換すると正しい結果が得られます。ただし、 JavaScriptをs.replace(/\[0\]/, "["+nel+"]");に変更すると、文字列sは変更されません。

元の著者が意図したことについて助言をいただき、検索文字列内の任意の場所に大括弧で囲まれた数字を正常に置き換える解決策を見つけるのに役立ちます。

答えて

2

任意の数字をキャプチャする式を作成するには

"$1["  # Insert the item captured above And [ 
+nel+  # New index 
"]"   # Close with ] 

を交換し

/   # Signifies the start of a regex expression like " for a string 
([^\[]+) # Capture the character that isn't [ 1 or more times into $1 
\[0\]  # Find [0] 
/   # Signifies the end of a regex expression 

を見つけ、あなたは数字1回以上一致します\d+0を置き換えることができます。

s.replace(/([^\[]+)\[\d+\]/, "$1["+nel+"]"); 
+0

ありがとう、本当にいい説明。次のアラートは[0]に連絡しますが、私のためには機能しません。 var nel = 1; var s = "連絡先[0]";s.replace(/([^ \\ [] +)\\ [\ d + \\] /、 "$ 1 [" + nel + "]"); アラート – Richbits

+0

var s = s.replace(...)はそのトリックを行います。変数への置き換えを割り当てる必要があります。文字列は変更されません。 –

+0

ありがとうございます、それは間違っていました、あなたの助けに感謝します。 – Richbits

2

$1は、正規表現の最初のグループの逆参照です。グループは()の中の作品です。したがって、この場合$1は、([^\[]+)の部分と一致するものに置き換えられます。

文字列がcontactDetails[0]の場合、結果の文字列はcontactDetails[1]になります。

この正規表現は、角括弧の中の0を置き換えることに注意してください。

([^\[]+)\[\d+\] 

\dマッチ任意の桁の文字:あなたは任意の番号を交換したい場合は、のようなものが必要になります。 \d+は少なくとも1桁の任意のシーケンスになります。

しかし、JavaScriptの文字列は不変なので、あなたのコードはまだ動作しません。つまり、一度作成すると変更することはできません。 メソッドは、元の文字列を変更する代わりに、新しい文字列を返します。あなたが使用する必要があります。それは例えば1

と0の配列を置き換えるよう

s = s.replace(...) 
+0

ありがとう、私は理解しているので、これは動作するはずですが、そうではありません。私はこのコードを抽出し、var s = ContactData [0]を設定するように変更しました。スクリプトブロック内のvanila htmlファイルに置き換えましたが、置換後は変更されません。どのようなアイデアが起こっている? – Richbits

+0

's = ContactData [0]'と言うとき、あなたは 's =" ContactData [0] "'を意味しますか?これは 'ContactData [0]'配列のインデックス0の値ではなく、内容が 'ContactData [0]'の文字列です。 –

+0

補遺:... ContactData配列の –

1

が見えます:   配列[0]は、配列に行く[1]

説明:

([^ [] +) - この部分は、変数ではないすべてを保存することを意味します。
[0]/        - この部分"0"の内容をプリントアウトし、nelの値で角かっこを追加します。パート1は、すべてを[0]

"$ 1 [" + nel + "] (あなたの例ではnel = 1)

0

大括弧は一致する文字の集合を定義します。 [abc]はa、b、またはcの文字と一致します。

カラットを追加することで、セットに含まれていない文字を指定するようになりました。 [^abc]は、a、b、またはc以外の文字に一致します。

大括弧はRegExpsで特別な意味を持つため、一致させたい場合はスラッシュでエスケープする必要があります。 [は文字セットを開始し、\[は中括弧に一致します。

したがって、[^\[]+は、[ではない1つ以上の文字をキャプチャします。

あなたが交換にそれを使用できるように、括弧内の文字列の一致した部分(この場合は「するcontactDetails」を「キャプチャ」ことをラッピング。

$1は「キャプチャ」の文字列(つまり「するcontactDetails」を使用しています)置換文字列に。

0

この正規表現は[0]続く「何かを」と一致します。
「何か」[ないすべての別文字に一致する表現[^\[]+によって識別されます。あなたはこの問題を回避()を見ることができます式は$ 1で後で再利用されるためですあなたの正規表現の残りの部分 - つまり\[0\]はインデックス[0]にマッチします。著者は\[\]と書く必要がありました。[と]は正規表現の特殊文字なので、エスケープする必要があります。

0

$ 1は、最初のペアレントペアの値への参照です。お使いの場合には「[」正規表現の

残りの部分は文字列に一致していない1つまたは複数の文字に一致し

[^\[]+ 

の値が「[0]」。

したがって、sが 'foobar [0]'の場合、結果は 'foobar [1]'になります。

0

[^\[]は、[ではない任意の文字と一致します。 '+'は1回以上意味します。だから[^ [] +はcontactDetailsとマッチします。ブラケットは後で使用するためにこれをキャプチャします。 '\'は末尾が\[0\]と一致するエスケープ記号です。[0]です。置換文字列は、カッコ内にキャプチャされた$ 1を使用し、新しいインデックスを追加します。

0

あなたの正規表現の解釈は正しいです。 [ではない1つ以上の文字に続いてリテラル[0]が続くことを意図しています。 replaceメソッドで使用された場合、最初のグループ($1が置き換えられるもの)と[の後にnel]の値が続き、その一致が置き換えられます(これは"$1["+nel+"]"の解釈方法です)。

また、単純なs.replace(/\[0\]/, "["+nel+"]")も同じです。 [0]の前に何もない場合を除いて、最初の正規表現は一致するものを見つけられないためです。