使用可选输入编写Regex

oiopk7p5  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(101)

我使用regexer.com来测试我的输入。我有两组正则表达式。第一组匹配1到3位数字,是可选的。第二组匹配2到3位数字,是强制的。
(\d{1,3})?[-]?(\d{2,3})

Group 1     Group 2

当我输入123-456时,这个正则表达式有效。当我输入不带-的输入时,它不起作用。例如,input:123 -〉group 1得到1,group 2得到2,3。我希望所有不带-的输入都在group 2中,因为group 1是可选的。对于input 1234,group 1得到123,group 2得到4。我如何编写一个正则表达式,使所有不带-的输入都转到group 2,并且如果我输入一个不带-的输入大于{2,3},它不会被接受?

xxhby3vn

xxhby3vn1#

一个简单的解决方案是按以下方式定义您的组:

Group 1: 1-3 digits and a hyphen (-), all optional
Group 2: 2-3 digits, mandatory

以这种方式编写正则表达式将确保如果您有一个单独的2或3位数字,它将始终被识别为组2的一部分,因为组1需要识别连字符。
示例:

(\d{1,3}[-])?(\d{2,3})

通过regex101.com验证。另外,请记住适当地锚正则表达式。
如果你想让它跟踪字符串的开始和结束,你可以锚你的表达式,^表示开始,$表示结束。
示例:

^(\d{1,3}[-])?(\d{2,3})$
ulydmbyx

ulydmbyx2#

如果我对问题的理解正确的话,你可以尝试匹配下面的正则表达式。

^((?:(?=\d+\-)\d{1,3}|(?!\d+\-)\d{0,3}?))\-?((?:(?<=\-)\d{2,3}|(?<!\-)\d{2,3}))$

Demo
这个正则表达式可以用 * 自由间距模式 * 编写,使其具有自文档性。

(?x)            # invoke free-spacing mode
^               # match the beginning of the string
(               # begin capture group 1
  (?:           # begin a non-capture group
    (?=\d+\-)   # pos lookahead asserts later in the string is a hyphen
    \d{1,3}     # match 1 to 3 digits, as many as possible
    |           # or
    (?!\d+\-)   # neg lookahead asserts no hyphen later in the string 
    \d{0,3}?    # match 0 to 3 digits, as few as possible
  )             # end of non-capture group
)               # end of capture group 1
\-?             # optionally match a hyphen
(               # begin capture group 2
  (?:           # begin a non-capture group
    (?<=\-)     # pos lookbehind asserts prev char is a hyphen
    \d{2,3}     # match 2 to 3 digits, as many as possible
    |           # or
    (?<!\-)     # neg lookbehind asserts prev char not a hyphen
    \d{2,3}     # match 2 to 3 digits, as many as possible
  )             # end of non-capture group
)               # end of capture group 2
$               # match end of string

相关问题