我试图写一个RegExp只匹配8位数,一个可选的逗号可能隐藏在数字之间。
所有这些都应该匹配:
12345678
12,45678
123456,8
现在我有:
^[0-9,]{8}
但当然错误地匹配012,,,67
实施例: https://regex101.com/r/dX9aS9/1
我知道选项存在但不了解如何保持8位数字长度适用于逗号,同时也将逗号限制为1。
任何提示都将不胜感激,谢谢!
答案 0 :(得分:3)
要匹配8个只能包含数字和中间可选逗号的字符串,可以使用
^(?=.{8}$)\d+,?\d+$
请参阅regex demo
前瞻将要求字符串包含8个字符。 ,?
会使逗号匹配成为可选项,+
之后的\d
将在可选逗号前后至少需要1位数。
如果您需要匹配包含8位数字和可选逗号的字符串,则可以使用
^(?:(?=.{9}$)\d+,\d+|\d{8})$
请参阅regex demo
实际上,字符串中的字符串中有9个字符(如果有逗号),或者只有8个字符(如果只有数字)。
说明:
^
- 字符串开头(?:(?=.{9}$)\d+,\d+|\d{8})
- 2个替代方案:
(?=.{9}$)\d+,\d+
- 1+位后跟1个逗号,后跟1位数,匹配的整个字符串应为9个字符长(8个数字和1个逗号)|
- 或\d{8}
- 8位数字$
- 字符串结尾请参阅Java code demo(请注意,对于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})$
答案 1 :(得分:2)
答案 2 :(得分:1)
/ ^(?!\d{0,6},\d{0,6},\d{0,6})(?=\d[\d,]{6}\d).{8}$/
我认为这种积极和消极前瞻的合作正是所要求的。如果删除开始和结束分隔符并设置g标志,那么它将尝试匹配长度超过8个字符的十进制字符串的模式。
说明:如果正面向前看(?!\d{0,6},\d{0,6},\d{0,6})
试图找到6个小数或逗号,则前面的负面向前(?=\d[\d,]{6}\d)
尝试不会并排找到任何逗号,如果它们之间有6个或更少的十进制字符两个十进制字符之间的字符。最后.{8}
选择8个字符。