2011-06-01 81 views

回答

4

根据表达式,它匹配任何具有6位或4位数的字符串。

但是,由于您使用的是(。*),表达式将匹配任何至少有4位数的字符串。

要匹配具有6个或4位可以使用:

/^\d{4}(\d{2})?$/ 
0

字面上:任何数量的字符,其与准确6个号码或正好4个号码结束。

技术上: 的奇怪的事情是,.*将允许与4号或以上的比赛结束任何有任何数量在此之前的数字,所以什么?

+0

更确切地说:任何数量的字符在**结尾至少有** 4个数字。 – 2011-06-02 11:39:02

2

的EXPR说:

(.*) take any number of arbitrary characters followed by ([0-9]{6}) six numbers 

- 或 -

(.*) take any number of arbitrary characters followed by ([0-9]{4}) four numbers 
0
  1. 这意味着随后6个或4位数
  2. 你认为你可以写这样的(.*)(\d{4}|\d{6})任何字符但捕获组会改变
0

相信这意味着匹配任一

的后面是6位数字的任何字符(.*)的任意数([0-9]{6}

或(|

的任何字符的任意数目( .*),接着是4位数字([0-9]{4}

. =任何字符
*指0,1或许多 - 在这种情况下...查找“的Kleene闭包”
[0-9]表示数字0-9
{6}意味着最后一个图案被重复6次

现在

...

是不是后跟6位数字的字符串也不符合字符串后跟4位数字的模式?如果这会导致问题,您可以在每个模式的末尾添加空白字符或行尾。

我可能已经做出假设你写等于

((.*)([0-9]{6}))|((.*)([0-9]{4})) 
0

见这意味着什么其他的答案。

无论是否有更简洁的写法,所有方法几乎都会编译为相同的DFA,因此执行方式相同。这种方式至少是清楚的。你无法理解这一点,为什么你想要更简洁?

0

正则表达式对我有意义的唯一方法是如果你试图从字符串中提取一定数量的连续数字。如果字符串中有多个可能的匹配项,则需要最后一个匹配项。

在第一替代的(.*)开始吃掉整个字符串,但随后回退足够远,使([0-9]{6})捕捉它们的最后六位。如果它一直没有找到匹配就退到开头,第一个备选报告失败。控制然后传递到第二个替代方案,它使用相同的技术来尝试和最后一个匹配四个数字。如果失败,整体匹配尝试失败。

我开始说正则表达式试图匹配字符串的末尾处的六位或四位数字,因为这是人们使用该技术的常见原因。但是这要求它像@ Cyber​​nate的正则表达式那样在最后停留。在你的情况是这样的:

^(?:(.*)([0-9]{6})|(.*)([0-9]{4}))$ 

开始锚 - ^ - 不要求进行匹配,但只允许每一个替代的匹配尝试提高效率。一些正则表达式的口味足够聪明,可以认识到如果(.*)在字符串的开头不匹配,那么在第二个位置,第三个位置等尝试它没有意义,但是你不能指望它。


编辑:我只是注意到java标记。如果你在Java的matches()方法中使用这个正则表达式,你不需要添加锚;该方法自动锚定两端的每个匹配。如果您希望你在比赛结束锚,你就必须“垫”更点明星的正则表达式:

(.*)([0-9]{6}).*|(.*)([0-9]{4}).* 
相关问题