Java Regex仅用于两个逗号分隔的值,保留第二个值为可选值

Java Regex仅用于两个逗号分隔的值,保留第二个值为可选值,java,regex,Java,Regex,我正在为两个逗号分隔的值(示例-坐标)创建正则表达式,我正在使用如下正则表达式- ^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$ 上面的正则表达式强制使用两个逗号分隔的值,但我希望第二个值是可选的,包括逗号,因此我尝试像这样更改正则表达式- ^(\-?\d+(\.\d+)?)(,\s*(\-?\d+(\.\d+)?)$)? 这是可行的,但保留第二个值是可选的,但也允许逗号不包含任何第二个值,如下所示- ^(\-?\d+(\.\d+)?),\s*(\-?\d+(\

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

^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$
上面的正则表达式强制使用两个逗号分隔的值,但我希望第二个值是可选的,包括逗号,因此我尝试像这样更改正则表达式-

^(\-?\d+(\.\d+)?)(,\s*(\-?\d+(\.\d+)?)$)?
这是可行的,但保留第二个值是可选的,但也允许逗号不包含任何第二个值,如下所示-

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


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

你把量词和锚放错了位置

使用

您可以调整模式中捕获组的数量,并通过在打开
)后添加
?:
,将可选组转换为非捕获组。我会像这样使用它

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

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

在Java中使用它时,不要忘记使用双反斜杠在字符串literal中定义一个literal反斜杠,如果将模式与
.matches()
方法一起使用,请忽略
^
$

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

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

$
锚定不能是可选组的一部分,而是放在它后面。@SebastianProske谢谢,这似乎有效,这是我的正则表达式现在=^(\-?\d+(\.\d+))(,\s*(\-?\d+(\.\d+))$抱歉,移动访问太糟糕了。我无法正确设置解释的格式。更好的是,您在列表的第一个减号后漏了一个空格。