Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式,用于在数字之间使用一个可选逗号匹配X数字?_Java_Regex - Fatal编程技术网

Java 正则表达式,用于在数字之间使用一个可选逗号匹配X数字?

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}(? (?是

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

所有这些都应匹配:

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:你能重新检查测试结果吗?输入1245678
1245678
有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})$