Java 如何使用正则表达式验证破折号分隔值?

Java 如何使用正则表达式验证破折号分隔值?,java,regex,Java,Regex,我有一个带数字和分隔符的字符串。 数字可以用逗号或连字符分隔。但可能永远不会有两个数字都用连字符分隔,中间没有逗号 例如: 有效:123,12,2,1-3,1,1-3,1 无效:123,12,2,1-3,1,1-3-5,1 我有一个几乎可以工作的正则表达式,除了它不检测那些1-3-5无效行之外 如何改进以下内容 ^([0-9])+((,|-)[0-9]+)*$ 您可以分解您的输入: 正常:一个或多个数字,可选后跟破折号,然后是一个或多个数字 特别:逗号 正常情况下的正则表达式可以写成\d+

我有一个带数字和分隔符的字符串。 数字可以用
逗号
连字符
分隔。但可能永远不会有两个数字都用连字符分隔,中间没有逗号

例如:

有效:
123,12,2,1-3,1,1-3,1

无效:
123,12,2,1-3,1,1-3-5,1

我有一个几乎可以工作的正则表达式,除了它不检测那些
1-3-5
无效行之外

如何改进以下内容

^([0-9])+((,|-)[0-9]+)*$

您可以分解您的输入:

  • 正常:一个或多个数字,可选后跟破折号,然后是一个或多个数字
  • 特别:逗号
正常情况下的正则表达式可以写成
\d+(?:-\d+)
;对于特殊情况,这只是

应用
normal*(特殊normal*)*
模式,并添加锚和量词,我们有:

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

您可以分解您的输入:

  • 正常:一个或多个数字,可选后跟破折号,然后是一个或多个数字
  • 特别:逗号
正常情况下的正则表达式可以写成
\d+(?:-\d+)
;对于特殊情况,这只是

应用
normal*(特殊normal*)*
模式,并添加锚和量词,我们有:

^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$
这里有一个解决方案:

^(?:\d+(?:-\d+)?(?:,|$))+$

说明:匹配一个数字,可以选择后跟破折号和另一个数字,然后匹配逗号或字符串的结尾。然后重复。

这里有一个解决方案:

^(?:\d+(?:-\d+)?(?:,|$))+$


说明:匹配一个数字,可以选择后跟破折号和另一个数字,然后匹配逗号或字符串的结尾。然后重复。

您可以使用look around添加条件,它将搜索
-数字-
,这样您的正则表达式可以如下所示:

^(?!.*-\\d+-)[0-9]+([,-][0-9]+)*$
 ^^^^^^^^^^^^-negative look-ahead, match will fail if there is any -digits- in your string

您可以使用look around添加条件,它将搜索
-数字-
,因此您的正则表达式可以如下所示:

^(?!.*-\\d+-)[0-9]+([,-][0-9]+)*$
 ^^^^^^^^^^^^-negative look-ahead, match will fail if there is any -digits- in your string

@alphabravo使用
\d
而不是
\\d
。在Java中,
\
也需要以字符串形式转义,所以我这样写。我明白了,您还必须添加
^
锚定。@alphabravo我刚才添加了
^
$
锚定以明确表示,但它们在我假设OP使用的
字符串.matcher(regex)
方法中是隐式的,所以
字符串.matches(“(?!.-\\d+-)[0-9]+([,-][0-9]+)*”
的工作原理与
字符串的工作原理相同。匹配(“^(?).*-\\d+-)[0-9]+([,-][0-9]+)*$”)
@alphabravo使用
\d
而不是
\\d
。在Java中
\
也需要在字符串中转义,所以我这样写。我明白了,您还必须添加
^
锚定。@alphabravo我刚才添加了
^
$
锚定以明确表示,但它们在
字符串.matcher(regex)中是隐式的
我假设OP正在使用的方法,所以
字符串.matches((?!!*-\\d+-)[0-9]+([,-][0-9]+*)”
的工作原理与
字符串.matches(^(?).*-\\d+-[0-9]+([,-][0-9]+*)的工作原理相同。