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]+*)的工作原理相同。