我正在尝试编写一个RegExp以仅匹配8位数字,并在数字之间隐藏一个可选的逗号。
所有这些都应该匹配:
12345678
12,45678
123456,8
现在我有:
^[0-9,]{8}
但是当然会错误地匹配 012,,,67
范例:https://regex101.com/r/dX9aS9/1
我知道存在可选内容,但不了解如何保持适用于逗号的8位数字长度,同时也将逗号限制为1。
任何提示将不胜感激,谢谢!
要匹配只能包含数字和介于中间的可选逗号的8个字符字符串,可以使用
^(?=.{8}$)\d+,?\d+$
前瞻性要求该字符串包含8个字符。,?
将使匹配逗号成为可选,而+
之后\d
将需要至少1位数字在可选逗号前后。
如果您需要匹配具有8位数字和可选逗号的字符串,则可以使用
^(?:(?=.{9}$)\d+,\d+|\d{8})$
实际上,该字符串在字符串中将有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})"));
领先/尾随逗号的注意事项:
您只需要在第一个替代分支中将+
(匹配1个或多个匹配项)量词替换为*
(匹配0个或多个匹配项)即可,以允许使用前导/后跟逗号:
^(?:(?=.{9}$)\d*,\d*|\d{8})$
观看此正则表达式演示
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句