正则表达式只有两个逗号分隔值,保持第二个值可选

时间:2017-06-15 12:15:21

标签: java regex

我正在为两个逗号分隔值创建正则表达式(例如 - 坐标),我正在使用如下所示的正则表达式 -

^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$

上面的正则表达式要求两个逗号分隔值,但我希望第二个值为可选,包括逗号,所以我尝试改变正则表达式,如下所示 -

^(\-?\d+(\.\d+)?)(,\s*(\-?\d+(\.\d+)?)$)?

这是有效的,但保持第二个值是可选的,但它也允许逗号没有任何第二个值,如下所示 -

  

3456,

如果第二个值不存在,可以在正则表达式中添加什么不允许使用逗号?感谢。

1 个答案:

答案 0 :(得分:2)

你把量词放错了位置。

使用

^(-?\d+(\.\d+)?)(,\s*(-?\d+(\.\d+)?))?$
                                     ^^

请参阅regex demo

您可以调整模式中的捕获组数量,并在打开?:后添加(,将可选组转换为非捕获组。我会像

一样使用它
^(-?\d+(?:\.\d+)?)(?:,\s*(-?\d+(?:\.\d+)?))?$

请参阅another demo

另请注意,您不需要在字符类之外转义连字符。

在Java中使用它时,不要忘记使用双反斜杠在字符串文字中定义文字反斜杠,如果使用带有^方法的模式,则省略$.matches()

s.matches("-?\\d+(?:\\.\\d+)?(?:,\\s*-?\\d+(?:\\.\\d+)?)?")

详细说明:

  • ^ - 字符串锚的开始
  • (-?\d+(\.\d+)?) - 第1组匹配可选的连字符,1 +位数,然后是一个点的可选序列(第2组),后跟一个或多个数字
  • (,\s*(-?\d+(\.\d+)?))? - 匹配一次或零次出现的可选序列(第3组):
    • , - 逗号
    • \s* - 零个或多个空格
    • (-?\d+(\.\d+)?) - 第4组匹配
      • -? - 一个可选的连字符
      • \d+ - 一个或多个数字
      • (\.\d+)? - 第5组匹配一个点的可选序列,后跟一个或多个数字
  • $ - 字符串结尾