0

我要匹配的模式是一些字符(字母+数字+连字符(-)),然后是 5 位数字,然后是 9 位数字。模式的每个部分由连字符分隔(-)5 位和 9 位部分是可选的,这意味着其中一个可能存在,而另一个可能不存在或可能两者都存在或可能两者都不存在。所以模式可以是这样的

bla-12-bla-98-bla-12345-123456789     all parts(characters+5-digit+9-digit)
bla-bla-123-12345                     9-digit part absent
blasd-123456789                       5-digit part absent
no-1045-numeric-bla-bla               both numeric parts absent

我想出的正则表达式是这个

.+(\d{5})?-?(\d{9})?$

上面的推理是这样的。由于.+开头匹配所有字符,因此(\d{5})?表示 5 位数部分可能有 0 个或 1 个实例,因此使其成为可选。

因为-?,如果两个数字部分都不存在,那么不会有任何-数字部分,但如果两个数字部分都存在,那么就会有 1 -,所以我再次将其设为可选。

同样对于(\d{9})?

但是上面的模式不匹配任何东西。我正在使用 python 所以两者group(1)group(2)返回None

以上有什么问题?

4

1 回答 1

2

问题是.+一开始。正则表达式解释器无法推断何时.+应该结束。因此,您的模式确实匹配,但您的匹配组将始终None如您所观察到的那样。如果你只是使用

(\d{5})?\-?(\d{9})?$

相反,它仍然会匹配您的所有示例,并且您的匹配组将被正确识别。

于 2012-06-17T20:18:07.837 回答