首页 > 解决方案 > 使用正则表达式仅允许左对齐零

问题描述

我对使用正则表达式相当陌生。我有一个序列号,它可以采用以下形式: VV-XXXXXX-P 或 VVXXXXXXP
如果使用连字符变体,那么“X”的数字可以是可变的。例如 01-162-8 等价于 010001628。

为了识别这两种格式,我创建了以下正则表达式:

String HYPHENS = ([0]{1}[13]{1}-[1-9]{1,6}-[0-9]{1})
String NO_HYPHENS = ([0]{1}[13]{1}[0-9]{6}[0-9]{1})

然而,NO_HYPHENS 变体的问题是它允许序列中的任何位置为 0 例如:010010628 不应该是有效序列,因为有一个非前导 0。

此外,我将如何创建一个正则表达式,我可以用它来替换序列中的所有 0,但第一个?我尝试了以下方法,但它也替换了第一个 0。

String code = 010001234;
code = code.replaceAll("0+", "");

我怎样才能修改正则表达式来实现这一点?

标签: javaregex

解决方案


您可以使用

String NO_HYPHENS = "0[13](?!0*[1-9]0)[0-9]{6}[0-9]";
code = code.replaceAll("(?!^)0(?!$)", "");

请参阅正则表达式演示。正0[13](?!0*[1-9]0)[0-9]{6}[0-9]则表达式匹配:

  • 0- 零
  • [13]- 一到三个
  • (?!0*[1-9]0)- 任何零后跟非零数字,然后在此位置不允许零
  • [0-9]{6} - 六位数
  • [0-9]- 一个数字。

我了解您在 Java 中使用它.matches,否则,^在开头和$结尾添加。

此外,(?!^)0(?!$)正则表达式将匹配不在字符串开始/结束位置的任何零。


推荐阅读