【问题标题】:Validating a numeric, 12-digit String containing a dash using regular expressions使用正则表达式验证包含破折号的 12 位数字字符串
【发布时间】:2016-11-18 21:56:33
【问题描述】:

我需要验证给定的字符串是否包含最多 12 位数字和一个短划线。

初始正则表达式: ^[0-9]*-?[0-9]*$

修改后的正则表达式: ^([0-9]*-?[0-9]*){1,12}$

示例(应有效):12356978-9

问题是第一个 RegEx 不验证长度,第二个不起作用。

注意:一切都必须在正则表达式中完成,而不是使用 string.length() 来检查长度

【问题讨论】:

  • 如果你能给出一些你想比较的示例字符串会很好。
  • 破折号后面会只有一位吗?
  • 123465789-10 有效,123456789-1011 因长度无效,123465789 无效,因为其中没有破折号
  • String s = ... ; return s.length()<=13 && s.matches("^\\d+-\\d+$");?
  • @Seth 你改变了问题。没有人说没有破折号是可接受的解决方案!

标签: java regex


【解决方案1】:

丑陋的方式:

^([0-9]-[0-9]{1,11}|[0-9]{2}-[0-9]{1,10}|[0-9]{3}-[0-9]{1,9}| ...)$

使用前瞻,结合两个条件:

^(?=\\d*-\\d*$)(?=.{1,13}$).*$

(灵感来自this Alan Moore's answer

【讨论】:

  • 第二个应该是公认的答案。如果可以的话,我会再次 +1,但我已经这样做了 :(
【解决方案2】:

如果您可以在正则表达式之外使用额外条件:

String s = ... ;
return s.length()<=13 && s.matches("^\\d+-\\d+$");

如果破折号可以开始或结束字符串,您可以使用以下内容:

String s = ... ;
return s.length()<=13 && s.matches("^\\d*-\\d*$");

【讨论】:

  • 知道如何在纯正则表达式中实现吗?
  • 是的,然后您可以实施@JiriTousek 的解决方案。不是很可读,但会完成这项工作。这并不意味着没有解决方案,只是如果有的话,除了Jiri Tousek,我不知道。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多