我正在为两个逗号分隔值创建正则表达式(例如 - 坐标),我正在使用如下所示的正则表达式 -
^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$
上面的正则表达式要求两个逗号分隔值,但我希望第二个值为可选,包括逗号,所以我尝试改变正则表达式,如下所示 -
^(\-?\d+(\.\d+)?)(,\s*(\-?\d+(\.\d+)?)$)?
这是有效的,但保持第二个值是可选的,但它也允许逗号没有任何第二个值,如下所示 -
3456,
如果第二个值不存在,可以在正则表达式中添加什么不允许使用逗号?感谢。
答案 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组匹配一个点的可选序列,后跟一个或多个数字$
- 字符串结尾