RegEx 用于匹配 X 位数字和数字之间的一个可选逗号?

Jav*_*med 5 java regex

我正在尝试编写一个 RegExp 以仅匹配 8 位数字,其中一个可选的逗号可能隐藏在数字之间。

所有这些都应该匹配:

12345678
12,45678
123456,8
Run Code Online (Sandbox Code Playgroud)

现在我有:

^[0-9,]{8}
Run Code Online (Sandbox Code Playgroud)

但当然这错误地匹配 012,,,67

示例:https : //regex101.com/r/dX9aS9/1

我知道存在选项,但不明白如何保持适用于逗号的 8 位长度,同时将逗号限制为 1。

任何提示将不胜感激,谢谢!

Wik*_*żew 5

要匹配只能包含数字和中间可选逗号的 8 个字符字符串,您可以使用

^(?=.{8}$)\d+,?\d+$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

前瞻将要求字符串包含 8 个字符。,?将使匹配逗号成为可选,并且+后面\d将要求可选逗号前后至少有 1 位数字。

如果您需要匹配具有 8 位数字和可选逗号的字符串,您可以使用

^(?:(?=.{9}$)\d+,\d+|\d{8})$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

实际上,该字符串将包含 9 个字符(如果有逗号),或者只有 8 个字符 - 如果只有数字。

解释:

  • ^- 字符串的开头
  • (?:(?=.{9}$)\d+,\d+|\d{8})- 2 个替代方案:
    • (?=.{9}$)\d+,\d+- 1 个以上数字后跟 1 个逗号后跟 1 个以上数字,并且匹配的整个字符串应为 9 个字符长(8 个数字和 1 个逗号)
    • |- 或者
    • \d{8}- 8 位数字
  • $- 字符串结尾

请参阅Java 代码演示(请注意String#matches(),使用 时,模式开头和结尾处的^$锚点是多余的,可以省略,因为与此方法一起使用时模式默认是锚定的):

List<String> strs = Arrays.asList("0123,,678", "0123456", // bad
        "01234,567", "01234567" // good
    );
for (String str : strs)
    System.out.println(str.matches("(?:(?=.{9}$)\\d+,\\d+|\\d{8})"));
Run Code Online (Sandbox Code Playgroud)

前导/尾随逗号注释:

您只需在第一个替代分支中将+匹配 1 次或多次出现)量词替换为*匹配 0 次或多次出现)即可允许前导/尾随逗号:

^(?:(?=.{9}$)\d*,\d*|\d{8})$
Run Code Online (Sandbox Code Playgroud)

请参阅此正则表达式演示