(.*)([0-9]{6})|(.*)([0-9]{4})
是否意味着拿起一个6位数或4位数的数字?是否有简洁的方法来写它?
答案 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)
(.*)(\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 处匹配六位或四位数,因为这是人们使用该技术的常见原因。但这需要它像@ Cybernate的正则表达式那样锚定在最后。在你的情况下,它看起来像这样:
^(?:(.*)([0-9]{6})|(.*)([0-9]{4}))$
起始锚点^
- 不是出于匹配目的所必需的,但它通过每次替换只允许一次匹配尝试来提高效率。一些正则表达式的风格很聪明,可以意识到如果(.*)
在字符串的开头不匹配,那么在第二个位置,第三个位置等处尝试它是没有意义的,但你不能指望它
编辑:我刚注意到java
标签。如果你使用这个正则表达式与Java的matches()
方法,你不需要添加锚点;该方法自动锚定两端的每个匹配。如果你不希望你的匹配在最后锚定,你将不得不用更多的点星“填充”正则表达式:
(.*)([0-9]{6}).*|(.*)([0-9]{4}).*