有人能解释这个正则表达式吗?

时间:2011-06-01 19:39:26

标签: java regex

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

是否意味着拿起一个6位数或4位数的数字?是否有简洁的方法来写它?

7 个答案:

答案 0 :(得分:4)

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

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

要将数字与6位或4位数匹配,您可以使用:

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

答案 1 :(得分:2)

expr说:

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

-OR -

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

答案 2 :(得分:0)

字面意思:任意数量的字符以6个数字或4个数字结尾。

技术上: 奇怪的是,.*允许任何具有任意数量的数字,所以任何以4个数字或更多数字结尾的东西都匹配?

答案 3 :(得分:0)

  1. 表示任意字符后跟6位或4位
  2. 您认为可以像(.*)(\d{4}|\d{6})一样编写,但捕获组会更改

答案 4 :(得分:0)

我相信这意味着匹配

任意数量的任何字符(.*)后跟一个6位数字([0-9]{6}

或(|

任意数量的任何字符(.*)后跟一个4位数字([0-9]{4}

. =任何字符
*表示0,1或多个 - 在这种情况下...查找“kleene closure”
[0-9]表示数字0-9
{6}表示最后一个模式重复6次

现在...

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

我可能已经假设你所写的内容等于

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

答案 5 :(得分:0)

请参阅其他答案。

是否有更简洁的方法来编写它,所有方法几乎肯定会编译为相同的DFA,因此执行相同。这种方式至少是清楚的。你很难理解这个,你为什么要让它更简洁?

答案 6 :(得分:0)

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

第一个选项中的(.*)最初吞噬了整个字符串,但随后它回退得足够远,以使([0-9]{6})能够捕获最后六个字符串。如果它在没有找到匹配的情况下一直退到开头,则第一个备选报告失败。然后控制转到第二个替代方案,它使用相同的技术尝试和最后一个匹配四个数字。如果失败,则整体匹配尝试失败。

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

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

起始锚点^ - 不是出于匹配目的所必需的,但它通过每次替换只允许一次匹配尝试来提高效率。一些正则表达式的风格很聪明,可以意识到如果(.*)在字符串的开头不匹配,那么在第二个位置,第三个位置等处尝试它是没有意义的,但你不能指望它


编辑:我刚注意到java标签。如果你使用这个正则表达式与Java的matches()方法,你不需要添加锚点;该方法自动锚定两端的每个匹配。如果你希望你的匹配在最后锚定,你将不得不用更多的点星“填充”正则表达式:

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