簡體   English   中英

正則表達式匹配有效電話號碼

[英]Regex match valid Phone Number

我對正則表達式很陌生,不確定我做錯了什么。

我正在尋找匹配以下數字格式的正則表達式:

匹配要求:

  1. 必須以 0 或 3 開頭
  2. 必須介於 7 到 11 位數字之間
  3. 不得允許升序數字。 例如 0123456789, 01234567
  4. 不得允許重復數字。 例如 011111111, 3333333333, 0000000000

這就是我想出的:

^(?=(^[0,3]{1}))(?!.*(\d)\1{3,})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$).{7,11}$

上述正則表達式不符合第 (4) 條條件。 不知道為什么。

任何幫助,將不勝感激。

謝謝

JS 風格的 PCRE 的解決方案是

/^[03](?!123456(7(8(9|$)|$)|$))(?!(?<d>.)\\k<d>+$)[0-9]{6,10}$/

說明

  1. ^[03]從字符串的開頭開始,然后讀取 0 或 3
  2. (?!123456(7(8(9|$)|$)|$))確保在第一個字符之后沒有序列(如果可以讀取序列,則負向前瞻失敗
  3. (?!(?<d>.)\\k<d>+$)是另一個負面的前瞻:它確保第一個字符讀取(標記為d )不會一次又一次地重復,直到字符串結束
  4. [0-9]{6,10}$/最終讀取6到10位數字(第一個已經讀取)

幾個測試:

  • “0123456789:不匹配”
  • “01234567:不匹配”
  • “01234568:不匹配”
  • “011111111:不匹配”
  • “33333333:不匹配”
  • “333333233 有效”
  • “042157891023 有效”
  • “019856:不匹配”
  • “0123451245 有效”

關於您嘗試的模式的一些說明

  • 您可以省略{1}[0,3]的逗號
  • 在前瞻(?!.*(\\d)\\1{3,})(\\d)是第二個捕獲組,因為(?=(^[0,3]{1}))包含第一個捕獲組所以它應該是\\2而不是\\1
  • 在前瞻中,您可以省略{3,}的逗號
  • 在匹配本身中,您使用.{7,11} ,其中點將匹配除換行符之外的任何字符。 您可以使用\\d代替僅匹配數字

你的模式可能看起來像

^(?=(^[03]))(?!.*(\d)\2{3})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)\d{7,11}$

正則表達式演示

或者省略第一個前瞻並將其移動到匹配項,將量詞更改為\\d{6,10}並重復捕獲組\\1而不是\\2

^(?!.*(\d)\1{3})(?!(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)[03]\d{6,10}$

正則表達式演示

編輯

根據評論,該字符串沒有 4 個升序數字:

^(?!.*(\d)\1{3})[03](?!\d*(?:0123|1234|2345|3456|4567|5678|6789))\d{6,10}$

正則表達式演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM