【问题标题】:Regex to match a string containing 14 digits and 1 character at any position正则表达式匹配任意位置包含 14 位数字和 1 个字符的字符串
【发布时间】:2023-01-12 17:05:38
【问题描述】:

我需要一个匹配 15 个字符的字符串的正则表达式,其中 14 个是数字,1 个是字符。该字符可以位于字符串的任何位置。

我有以下长正则表达式:

^.\d{14}|\d{1}.\d{13}|\d{2}.\d{12}|\d{3}.\d{11}|\d{4}.\d{10}|\d{5}.\d{9}|\d{6}.\d{8}|\d{7}.\d{7}|\d{8}.\d{6}|\d{9}.\d{5}|\d{10}.\d{4}|\d{11}.\d{3}|\d{12}.\d{2}|\d{13}.\d{1}|\d{14}.$

可以简化吗?

这是一个示例匹配:1000-1234567890

【问题讨论】:

  • 这取决于您在哪里使用正则表达式。在 Go (RE2) 中,你不能这样做。

标签: regex


【解决方案1】:

我们可以在这里使用环视技巧:

^(?!(?:.*D){2})(?=.{15}$)d*Dd*$

此正则表达式模式表示匹配:

  • ^ 从字符串的开头
  • (?!(?:.*D){2})断言不会出现 2 个或更多非数字(意味着最多出现 1 个)
  • (?=.{15}$)断言长度为15个字符
  • d*Dd* 然后是一个非数字,可能两边都被数字包围
  • $字符串结尾

【讨论】:

  • (?!.*D.*D) 是多余的。对于^d*Dd*$,您不能有两个D
【解决方案2】:

(?=^.{15}$)d{0,14}Dd{0,14}$

首先检查字符串长度为 15 个字符,然后是 0-14 位数字,一个非数字,然后是 0-14 位数字。
这与原始正则表达式不完全相同,后者允许连续 15 个数字。为此,只需将 D 更改为 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多