2011-11-07 6 views
3

ここで何が間違っていますか?正規表現で無効な数量化のjavascriptエラー

私は文字列内の数字をjavascriptを使って別の数字に置き換えようとしています。私はそれに番号1を何度も持っている長い文字列を持っています。私は、1が2のいずれかに別の番号を持つ場合を除いて、すべての場合に1と2を置き換える必要があります。私はregexを使う方法についてたくさんのGoogle検索をしました(私は完全に正規表現に新しいです)。そしてこれを思いつきました。

string.replace(/(?<!\d)1(?!\d)/,2); 

は基本的に、私は正規表現が一致(したがって置き換える)それは別の番号以外のものに囲まれている番号1のすべての発生します。マッチに周囲の文字を含めることは望ましくありません。数字は1だけです。

私のファイヤーブートコンソールでは無効な数量エラーが発生し続けます。私は間違って何をしていますか?

答えて

7

このビットは(?<!\d)です。 (?<はなく、(?:,(?=、および(?!のみです。

JavaScriptがルックの背後にありませんが、私はこのように、あなたはこのような場合には、それを回避することができると思う:(

桁の直前に文字を取り込み
str = str.replace(/(^|\D)1(?!\d)/g, "$12") 

は、それをエコーバック置換文字列には$1)、新しいコンテンツ(2)が続きます。先頭に近い^は、数字が文字列の最初の文字であることを可能にします。それを破壊

Live example

(^|\D) Match either start-of-string, or a non-digit, and capture the result 
1  Match the digit 1... 
(?!\d) ...but only if it isn't followed by a digit

や交換では、$12は「(それは私にどのように見えるかである) "キャプチャグループ12と交換" ではありませんが、キャプチャグループ1の後に数字2を置き換えます。

+0

コロンはネガティブなルックバックの正しい演算子ですか?私は[link] http://www.regular-expressions.info/lookaround.htmlで否定的なlookbehindを行う方法を読んでいました。彼はltの文字を使用すると言います。あなたが言ったように私はそれをコロンと置き換えました。私はもはやエラーを取得しませんでしたが、いずれの一致も返しませんでしたか?最後のスラッシュの後にgを追加して、すべての発生に一致させようとしましたが、それでも動作しません。私はここでは無知だ。 – codescribblr

+0

@Jonathan:いいえ、JavaScriptにはルック・バックがありません(先読みのみ、正と負の両方)。 '?:'は単にキャプチャしていないブロックを示します。 –

+0

すばらしい説明!本当にありがとう。ここで私があなたが私に与えたものに基づいて終わったのです: 'var i = 1; \t $( "#のaddshipmentobjecbutton"()関数(){ \t \tをクリックします(私は= 5){ \t \t \t VAR old_object = $( '#のshipmentobject' <)であれば、HTML();。。 \t \t \t var new_object = old_object.replace(/(^!\ D)\ d(?!\ d)/ g、 "$" + i + 2); \t \t \t $( '#shipmentobjects')append( "

" + new_object + "
"); \t \t \ti ++; \t \t }); – codescribblr