盡管我經常使用正則運算式,但我很少創建自己的正則運算式。我最近一直在閱讀它們,因為我需要為我正在從事的專案創建一些相當具體的運算式。
關于表格中允許使用哪些電話號碼,我有一個非常具體的簡介。前兩個或前三個數字都有限制。
數字必須以06或開頭,07或者以 、081或開頭。082083084
我寫了一個帶有條件陳述句的正則運算式,我認為它應該做兩件事之一:
- 如果數字以
06or開頭07,則檢查字串中的其他 8 個字符是否為數字。 - 如果數字以 開頭
08,請檢查下一個字符是否在1和之間4,然后檢查其他 7 個字符是否為數字。
我使用本教程來了解條件如何在正則運算式中作業。這是我創建的運算式:
const validMobile = new RegExp(/^((0)?([6-7])[0-9]{8}|([8])[1-4][0-9]{7}) *$/);
我在這里的理解如下:
/^(以。。開始)(0)(必須先有一個零)?([6*7])(如果第二個字符是六或七)[0-9]{8}(檢查接下來的八個字符是否為 0 到 9 之間的數字)|(8)(否則,如果第二個字符是八)[1-4](檢查第三個字符是否為 1 到 4 之間的數字)[0-9]{7}(檢查以下七個字符是零到九之間的數字)
請注意,正在其他地方檢查字串的長度,盡管我認為這個運算式也應該有助于檢查數字是否正好是 10 個字符長。
這沒有達到預期的結果,所以我一定是誤解了一些東西。誰能幫我理解我可能出錯的地方?
uj5u.com熱心網友回復:
- 圓括號不是為了好玩:如果您不想捕獲任何內容,請不要使用它們。僅將它們用于您的
(this|that)問題,其中管道用作 OR 運算子。 - 如果您只允許 2 個字符,則方括號不需要范圍。
- 如果一個字符是強制性的,那么就寫它。不要放在方括號中,也不要放在圓括號中。
?是一個量詞,表示之前的內容是可選的(可以出現 0 次或一次)。如果你把它放在你的零后面,那么你就讓它與“必須在那里”相反。
考慮到這些知識并將正則運算式寫入多行并忽略其間的任何空格,然后得出:
^0(
[67][0-9]{8}
|
8[1-4][0-9]{7}
)$
我還洗掉了您電話號碼后面的可選空格:您沒有解釋過您想要這樣的東西,也沒有在您的串列中。只在電話號碼后面而不是前面允許空格也是沒有意義的。所以這 *部分也不是為了好玩。
我也強烈反對在電話號碼上使用正則運算式:人們傾向于輸入電話號碼,而不是中間沒有空格或連字符。查看所有現有的 Qs。
uj5u.com熱心網友回復:
您的正則運算式的問題是兩種選擇(0)?([6-7])[0-9]{8}和([8])[1-4][0-9]{7}. 你在第一個里面有前導零,所以像0811234567需要匹配第二個的數字永遠不會匹配。如果您將零從第一個替代項移到外部,它將開始按您的預期作業:
^0(([6-7])[0-9]{8}|(8)[1-4][0-9]{7}) *$
在regex101上親自查看...
對原始正則運算式的進一步評論:
- 零之后的
?實際上使它成為可選的,這就是我洗掉它的原因。 - 你有一些可疑的捕獲組(
([6-7])和([8])),你真的需要那些嗎? - 由@AmigoJack 推動的更多清理:
[8]沒有效果的字符類 ->8。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437248.html
標籤:javascript 正则表达式 电话号码
上一篇:多行注釋flexlex
