2016-07-24 6 views
0

これは、電話番号正規表現でラインを完全に無視するには? (先読みが動作しません)

(([0-9]{3}[-./ ]{0,1}[0-9]{3}[-./ ]{0,1}[0-9]{4}))|([(][0-9) ]{4,5}[0-9]{3}[-]{0,1}[0-9]{4}) 

を見つけるための私の正規表現では、ここでのアクションでそれを参照してください - その前の記号が#であればhttp://regexr.com/3dsbk

私の目標は、それぞれの結果を無視することです

(?!#)(([0-9]{3}[-./ ]{0,1}[0-9]{3}[-./ ]{0,1}[0-9]{4}))|([(][0-9) ]{4,5}[0-9]{3}[-]{0,1}[0-9]{4}) 

をしかし、それは動作しません:

私はこのように、負の先読みを追加しようとしました。

+1

問題は否定的なルックアヘッドルックス...まあ先に。これは、_match_の最初の位置から始まり、正規表現がマッチしていないかどうかを調べます。あなたはJavascriptが持っていないlookbehindが必要です。 – bwoebi

+0

JSは洗練されていないので、何も無視することはできません。これを行う方法は、犯罪者とマッチさせてから、何かとマッチした後に無視するかどうかです。 (2)[0-9] {4} | [(] [0-9]){4、 5} [0-9] {3} - ?[0-9] {4}) 'のようになります。 – sln

答えて

1

正規表現自体は役に立ちません。パターンマッチングの周りにいくつかのプログラミングロジックを使用する必要があります。通常のルックバックヒントの置換は、パターン開始時にオプションのグループを使用し、グループが一致するかどうかを確認することです。一致した場合、一致する前の文字列が存在する - >それらの一致を破棄する必要があります。そうでなければ、それらを入手してください。

/(#)?[0-9]{3}[-.\/ ]?[0-9]{3}[-.\/ ]?[0-9]{4}|[(][0-9) ]{4,5}[0-9]{3}-?[0-9]{4}/g 

は、以下のコードなしで値を持たないregex demoを参照してください:

var re = /(#)?[0-9]{3}[-.\/ ]?[0-9]{3}[-.\/ ]?[0-9]{4}|[(][0-9) ]{4,5}[0-9]{3}-?[0-9]{4}/g; 
 
var str = '1012 345 6789\n#1231231231 (only this to be ignored)\nphone 1231231231\n1012.345.6789\n012/345/6789\n555-123-4567 \n+1-(800) 555-2468\n+1-800 555-2468'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (!m[1]) { 
 
     res.push(m[0]); 
 
    } 
 
} 
 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

あなただけの周りに単語の境界 \bを追加することによって、全体の単語を抽出するために、あなたの正規表現を調整する必要があるかもしれません

パターンは/(#)?\b[0-9]{3}[-.\/ ]?[0-9]{3}[-.\/ ]?[0-9]{4}|[(][0-9) ]{4,5}[0-9]{3}-?[0-9]{4}\b/gですが、それ以上の調整が必要な場合があります。

1
([^#](([0-9]{3}[-./ ]{0,1}[0-9]{3}[-./ ]{0,1}[0-9]{4}))|([(][0-9) ]{4,5}[0-9]{3}[-]{0,1}[0-9]{4})) 
+0

それは私のために働く – beatrice

+0

うん、それは私の間違いだった。 しかしあなたは、先行するシンボル#を持つ数字は無視しなければならないと言っているので、最後に#が付いている数字はキャプチャしても問題ありません。 – beatrice

+0

ああ、私は前のことに関するOPの質問を誤解しました。 +1 – KevBot

関連する問題