2016-07-24 85 views
0

這是我查找電話號碼如何用regex完全忽略這一行? (超前不工作)

(([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

問題是消極的lookahead看起來......好吧...提前。它看起來是否從_match_的第一個位置開始,正則表達式不匹配。你會想要一個向後看,哪些Javascript沒有。 – bwoebi

+0

JS不夠複雜,無法「忽略」任何東西,更不用說了。做到這一點的方法是與違規者相匹配,然後在匹配某事後忽略它。 '([#])?((?:[0-9] {3} [ - 。/]?){2} [0-9] {4} | [(] [0-9) 5} [0-9] {3} - ?[0-9] {4})'如果捕獲組1匹配忽略它。 – 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