【问题标题】:RegEx to allow hyphens (maximum 3) in a string but do not count it in length正则表达式允许字符串中的连字符(最多 3 个)但不计算长度
【发布时间】:2022-07-03 04:20:24
【问题描述】:

我的要求是将输入字符串的长度限制为 11,它可以是带有连字符的字母数字。允许的最大连字符为 3 个,不应考虑连字符的长度。另一个要求是不允许超过 5 个连续重复数字。

我的正则表达式是^(?!.*([0-9])\\1{5})(?=.*([-]){0,3})[a-zA-Z0-9]{11}$

【问题讨论】:

  • 输入是否必须是 11 个字符(连字符除外)或是否有最小值?
  • 不过,输入字符串中不允许使用连字符 - 那么有什么要求呢?是否可以有连字符?
  • @JvdV,输入必须是 11 个字符。没有最低要求。
  • @WiktorStribiżew,必须允许使用连字符。

标签: java regex


【解决方案1】:

嗯,一种方法是:

^(?!.*?(\d)\1{5})(?=(?:[a-z0-9]-?){11}$)[a-z0-9]+(?:-[a-z0-9]+){0,3}$

在线查看demo


  • ^ - 起跑线锚点;
  • (?!.*?(\d)\1{5}) - 否定前瞻断言输入没有重复 6 次的数字;
  • (?=(?:[a-z0-9]-?){11}$) - 断言输入的正向前瞻有 11 个字母数字字符(带有可选连字符);
  • [a-z0-9]+(?:-[a-z0-9]+){0,3} - 1+ Alnum 字符后跟一个非捕获组(0-3 次)以允许使用连字符;
  • $ - 终点线锚。

请注意,它不允许连字符出现在以下任一位置:开始、结束或连续。进一步注意,我使用了不区分大小写的标志。

【讨论】:

  • 嗨@JvdV,感谢您的明确解释。我正在尝试在 Oracle 数据库脚本中实现相同的逻辑,例如 IF(REGEXP_LIKE(<myInput>,'(?=(?:[0-9]-?){11}$)') AND NOT REGEXP_LIKE(<myInput>,'([0-9])(\1){5}') AND REGEXP_LIKE(<myInput>,'^[0-9]+(?:-[0-9]+){0,3}$')) THEN .... 你在这里看到任何问题吗?只有第二个正则表达式(超过 5 个连续重复数字)正常工作。它不接受带连字符的输入。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多