regex 使用正则表达式验证以下要求?

idfiyjo8  于 2023-01-10  发布在  其他
关注(0)|答案(5)|浏览(165)

我正在尝试验证一个数字正好15位数,其中5位数由"-",":","/"分隔,应该以5或4或37开头,它也不应该包含任何字符。
意思是
37344 - 37747 - 27744-有效
40344 - 37747 - 27744-有效
59344 - 37747 - 27744-有效
37344:37747:27744-有效
37344/37747/27744-有效
87887 - 98734 - 83422-无效
548aa:aa764:90887-无效
37759\29938\92093-无效
我只能走这么远

\d{5}[-:\/]\d{5}[-:\/]\d{5}

请帮帮我。

q8l4jmvw

q8l4jmvw1#

试试这个:

(((5|4)\d{4})|((37)\d{3}))[-:\/]\d{5}[-:\/]\d{5}

https://regex101.com/r/VvTq5P/1

    • 编辑:**

我还要补充一点:\b在开始和结束时:

\b(((5|4)\d{4})|((37)\d{3}))[-:\/]\d{5}[-:\/]\d{5}\b

所以不是这样的:

12337344-37747-27744

可以通过测试。

gfttwv5a

gfttwv5a2#

你可以使用look ahead (?=.)来首先检查你的字符串是否以数字5|4|37开头,这是要求,下面是完整的模式:

^(?=5|4|37)\d{5}[-:\/]\d{5}[-:\/]\d{5}$

Demo here

cwtwac6a

cwtwac6a3#

如果我理解正确的话,正则表达式是:

((5|4)\d{4}|37\d{3})[-:\/]\d{5}[-:\/]\d{5}

需要
4XXXX、5XXXX或37XXX
所以我把它分成三份

ee7vknir

ee7vknir4#

((5|4)\d{4}|37\d{3})[-:\/]\d{5}[-:\/]\d{5}

(五|4)\d {4}-查找以5或4开头且其后为四位数字的数字。
然后,或37\d {3}查找37和其后的三位数字。

jtoj6r0c

jtoj6r0c5#

如果分隔符必须相同:

^(?=37|[54])\d{5}([-:\/])\d{5}\1\d{5}$
    • 说明**
  • ^字符串开始
  • (?=37|[54])正向前瞻,向右Assert3754
  • \d{5}匹配5位数字
  • ([-:\/])捕获组1,匹配-:/之一
  • \d{5}匹配5位数字
  • \1反向引用以匹配与组1中相同的分隔符
  • \d{5}匹配5位数字
  • $字符串结束

参见regex101 demo

const regex = /^(?=37|[54])\d{5}([-:\/])\d{5}\1\d{5}$/;
[
  "37344-37747-27744",
  "40344-37747-27744",
  "59344-37747-27744",
  "37344:37747:27744",
  "37344/37747/27744",
  "87887-98734-83422",
  "548aa:aa764:90887",
  "37759\\29938\\92093",
  "37344-37747/27744",
  "37344:37747-27744"
].forEach(s =>
  console.log(`${s} --> ${regex.test(s)}`)
)

使用交替而不进行环视的模式:

^(?:37\d{3}|[54]\d{4})([-:\/])\d{5}\1\d{5}$

参见regex101 demo

const regex = /^(?:37\d{3}|[54]\d{4})([-:\/])\d{5}\1\d{5}$/;
[
  "37344-37747-27744",
  "40344-37747-27744",
  "59344-37747-27744",
  "37344:37747:27744",
  "37344/37747/27744",
  "87887-98734-83422",
  "548aa:aa764:90887",
  "37759\\29938\\92093",
  "37344-37747/27744",
  "37344:37747-27744"
].forEach(s =>
  console.log(`${s} --> ${regex.test(s)}`)
)

相关问题