Java 正则表达式,用于在数字之间使用一个可选逗号匹配X数字?
我正在尝试编写一个只匹配8位数字的RegExp,数字之间可能隐藏一个可选的逗号 所有这些都应匹配:Java 正则表达式,用于在数字之间使用一个可选逗号匹配X数字?,java,regex,Java,Regex,我正在尝试编写一个只匹配8位数字的RegExp,数字之间可能隐藏一个可选的逗号 所有这些都应匹配: 12345678 12,45678 123456,8 现在我有: ^[0-9,]{8} 但这当然会错误地匹配012、、、67 例如: 我知道存在可选字符,但不知道如何将8位长度应用于逗号,同时将逗号限制为1 任何提示都将不胜感激,谢谢 如果您想让后面的逗号 ^((\d,?){8})$ 否则,请使用以下选项: ^((\d,?){8})(?<!,)$ ^(\d,?)8}(? (?是
12345678
12,45678
123456,8
现在我有:
^[0-9,]{8}
但这当然会错误地匹配012、、、67
例如:
我知道存在可选字符,但不知道如何将8位长度应用于逗号,同时将逗号限制为1
任何提示都将不胜感激,谢谢 如果您想让后面的逗号
^((\d,?){8})$
否则,请使用以下选项:
^((\d,?){8})(?<!,)$
^(\d,?)8}(?
(?是一个。若要匹配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位数字
$
-字符串结尾
请参阅(注意,对于String#matches()
,模式开始和结束处的^
和$
锚点是冗余的,可以省略,因为与此方法一起使用时,默认情况下会锚点模式):
参见/^(?!\d{0,6}、\d{0,6}、\d{0,6})(?=\d[\d,]{6}\d)。{8}$/
我猜这种积极和消极的前瞻性的合作正是我们所要求的。如果删除开始和结束分隔符并设置g标志,那么它也会尝试沿着长度超过8个字符的十进制字符串匹配模式
请试一试
说明:如果在两个十进制字符之间有6个或更少的小数字符,则负前瞻(?!\d{0,6}、\d{0,6}、\d{0,6})尝试不并排查找任何逗号,而正前瞻(?=\d[\d,]{6}\d)
尝试在两个十进制字符之间查找6个十进制或逗号字符。最后一个{8}
选择8个字符。可以有前导或尾随逗号吗?我认为这对我的示例来说并不重要,但如果你知道这个解决方案,那么理解它可能也很好。我将它添加到了我的答案中。哇,谢谢你的答案!应该也能帮助其他人,而且我还了解了关于RegExp的更多信息:)@Wiktor Stribiżew:你能重新检查测试结果吗?输入12456781245678
有7个数字,而不是8个。我试图编写一个只匹配8个数字的正则表达式,数字之间可能隐藏一个可选的逗号。-这是正确的要求吗?是的,我想我的意思是8个字符,8个数字或7个数字加1个逗号。我在答案中添加了正则表达式。
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})"));
^(?:(?=.{9}$)\d*,\d*|\d{8})$