0

这个问题类似,但差异足够微妙,我仍然需要一些帮助。

目前我有:

'(.*)\[(\d+\-\d+)\]'

作为我的正则表达式,它匹配任意数量的字符,后跟方括号 [],其中包含用破折号分隔的两位小数。我的问题是,我希望它也只匹配方括号之间的一个十进制数字,甚至方括号之间可能没有任何内容。所以:

word[1-5] = match
word[5] = match
word[] = match (not essential)

并确保

word[-5] = no match

谁能指出我下一步的方向。我目前发现正则表达式有点像猜谜游戏,尽管我想和它们一起变得更好。

4

4 回答 4

3

和你一起去,让最后一部分可选

(.*)\[(\d+(-\d+)?)\]

使用?.

为了完成其他任务,好吧,再去?一次

(.*)\[(\d+(-\d+)?)?\]
                  ^here

一个工作示例http://rubular.com/r/t0MaHyHfeS

于 2012-10-26T16:30:45.490 回答
1

用于?匹配 0 或 1 匹配

所以使用?for-\d+和 用于分隔的两个数字-

(.*)\[(\d+(-\d+)?)?\]

无需转义-..只有在字符类之间才有特殊含义。

于 2012-10-26T16:31:13.043 回答
0

(.*)\[((\d+(?:\-\d+)?)?)\]

这将匹配所有内容,即使其中有 0 个数字,并且会反向引用您(在匹配 [1-5] 中):

1- 比赛 2- 1-5

于 2012-10-26T16:32:51.653 回答
0

并非每个正则表达式解释器都支持这一点,但您可以为括号内的部分尝试“或”运算符:

'(.*)\[(\d+\-\d+|\d+)\]'
于 2012-10-26T16:33:24.680 回答