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

时间:2016-04-07 18:30:09

标签: java regex

我试图写一个RegExp只匹配8位数,一个可选的逗号可能隐藏在数字之间。

所有这些都应该匹配:

12345678
12,45678
123456,8

现在我有:

^[0-9,]{8}

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

实施例: https://regex101.com/r/dX9aS9/1

我知道选项存在但不了解如何保持8位数字长度适用于逗号,同时也将逗号限制为1。

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

3 个答案:

答案 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})$

请参阅this regex demo

答案 1 :(得分:2)

如果要使用尾随逗号,可以使用以下正则表达式:

text 2

Demo

否则请使用以下一个:

^((\d,?){8})$

Demo

^((\d,?){8})(?<!,)$ negative-lookbehind

答案 2 :(得分:1)

/ ^(?!\d{0,6},\d{0,6},\d{0,6})(?=\d[\d,]{6}\d).{8}$/

我认为这种积极和消极前瞻的合作正是所要求的。如果删除开始和结束分隔符并设置g标志,那么它将尝试匹配长度超过8个字符的十进制字符串的模式。

请尝试http://regexr.com/3d63m

说明:如果正面向前看(?!\d{0,6},\d{0,6},\d{0,6})试图找到6个小数或逗号,则前面的负面向前(?=\d[\d,]{6}\d)尝试不会并排找到任何逗号,如果它们之间有6个或更少的十进制字符两个十进制字符之间的字符。最后.{8}选择8个字符。