Java 使用正则表达式只允许左对齐的零

Java 使用正则表达式只允许左对齐的零,java,regex,Java,Regex,我对使用正则表达式相当陌生。我有一个序列号,可以采用以下形式:VV-XXXXXX-P或VVXXXXXXXXP 如果使用连字符变量,则“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变量的问题

我对使用正则表达式相当陌生。我有一个序列号,可以采用以下形式:VV-XXXXXX-P或VVXXXXXXXXP
如果使用连字符变量,则“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+", "");
如何修改正则表达式以实现这一点

^0[13]0*[1-9]*[0-9]$
^
-字符串的开头
0
-第一个符号必须为零
[13]
-第二个符号必须是一个或三个
0*
-可变长度的零序列
[1-9]
-可变长度的非零序列
[0-9]
-最后一个数字(也可以用\d替换)
$
-字符串结尾

这个正则表达式有一个问题:它不检查序列号的XXXXXX部分中有多少位数字。但您可以使用长度函数进行检查:

      String code = "010000230";
      if (code.matches("^0[13]0*[1-9]*[0-9]$") && code.length() == 9) {
         // code is valid
      }
      // replacement
      code = code.replaceAll("^(0[13])0*([1-9]*[0-9])$", "$1$2");
替换说明:
(0[13])
组号1(组号在括号中)
0*
一些零
([1-9]*[0-9])
组号2

这将替换为:
$1$2
组号1和组号2($1表示组号1)

您可以使用

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]
regex匹配:

  • 0
    -零
  • [13]
    -一个或三个
  • (?!0*[1-9]0)
    -此位置不允许任何零后跟非零数字,然后是零
  • [0-9]{6}
    -六位数字
  • [0-9]
    -一个数字
我知道您在Java中将它与
.matches
一起使用,否则,请在开头添加
^
,在结尾添加
$


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

[0-9]
匹配零。使用
[1-9]
仅匹配非零不可能,因为当使用非连字符选项时,XXXXX部分中可能有前导零,请使用
字符串NO_HYPHENS=“0[13](?!0*[1-9]0)[0-9]{6}[0-9]”,请参阅。它是否有效?另外,若要删除不在开始处的零,请使用
(?!^)0
是,它似乎可以正常工作!感谢您的回答和时间,祝您周末愉快感谢您的时间,我将接受上述答案,因为它更适合我的具体问题,因为它不需要长度检查警告:接受的答案也会删除零,如果它位于最后位置010000230将被0123As@mateuszl1995替换,这还将删除最后一个上的0position@Bogdan如果不需要删除最后的
0
,请使用
(?!^)0(?!$)