2017-08-04 106 views
1

我有一個正則表達式的問題,我已經將其減少到這樣的代碼:regex.test返回意外的結果

const ENV_NAME_REGEX = '[a-zA-Z_]+[a-zA-Z0-9_]*' 
const array = ["VALID", "9INVALID"] 
array.forEach((item) => { 
    const valid = new RegExp(ENV_NAME_REGEX).test(item) 
    console.log(valid) 
}) 

實際輸出:

真實,真實

預計產量:

true,false

數組中的第二項與正則表達式權限不匹配(因爲第一個字符不能是數字)。那爲什麼它輸出都是真的?

+2

只是一個建議,只要你用正則表達式,使用像[regex101.com](https://regex101.com/r/cN5jI4/1)在線門戶網站,解釋你目前的是什麼做並檢查它是否與requi匹配種類調和。 – Rajesh

回答

1

您需要錨點:^開頭,$結束。否則,您的正則表達式匹配字符串的中間中的文本。

const ENV_NAME_REGEX = '^[a-zA-Z_]+[a-zA-Z0-9_]*$' 
 
// ---------------------^-----------------------^ 
 
const array = ["VALID", "9INVALID"] 
 
array.forEach((item) => { 
 
    const valid = new RegExp(ENV_NAME_REGEX).test(item) 
 
    console.log(valid) 
 
})


邊注:除非有很好的理由做其他的事情,使用正則表達式的文字符號,而不是字符串記號和構造,這樣你就不用上班關於雙重逃脫;和重複使用實例:

const ENV_NAME_REGEX = /^[a-zA-Z_]+[a-zA-Z0-9_]*$/ 
 
const array = ["VALID", "9INVALID"] 
 
array.forEach((item) => { 
 
    const valid = ENV_NAME_REGEX.test(item) 
 
    console.log(valid) 
 
})

(我們知道它是安全的重用實例,因爲沒有g標誌當有g標誌,它,如果你仔細地處理它的安全。)

+0

感謝您的提示 - 關於您的一面,我養成了使用字符串符號的習慣,所以我可以在正則表達式中使用變量 - 是否可以使用字面符號進行變量使用?非常感謝 - 一旦它允許我接受你的答案 – danday74

+1

@ danday74:不,要用變量構建一個表達式,你需要使用構造函數。但是,當你不需要用變量輸入構造正則表達式時,我會避免使用構造函數(根據我的經驗,需要構建動態變量是非常罕見的)。 –

1

對於RegExp.prototype.test(),部分匹配就足夠了。

從MDN文檔:

使用test(),每當你想知道的模式是否在 字符串中找到[...]

1

使用錨^和$否則會部分匹配爲真