HTML5中的这个Parathensis在Regex中是否必要?

时间:2016-04-20 16:19:09

标签: regex html5

以下代码摘自HTML5上的一本书:

<label for="zip">US Zip code</label>
<input id="zip" name="zip" pattern="[\d]{5}(-[\d]{4})">

我认为[\d]{5}(-[\d]{4})中的Parathensis是多余的,这意味着: [\d]{5}(-[\d]{4})等于[\d]{5}-[\d]{4}

是不是?

2 个答案:

答案 0 :(得分:1)

圆括号用于捕获组,如果不使用捕获组,可以删除它们

可以肯定的是,我试过这个网站http://www.regexr.com/

答案 1 :(得分:1)

首先,模式中的字符类相当多余,可能会因误解字符类的工作原因而导致进一步的问题。

经验法则如果您不需要,则不使用某些内容。因此,将模式“简化”为\d{5}(-\d{4})

您的模式中的一对非转义括号用于group and capture(将子匹配放入为每个此类组分配的内存缓冲区中)。

因此,\d{5}(-\d{4})匹配字符串开头的5位数字(因为默认情况下,模式属性正则表达式固定在^(?:)$两侧)然后匹配和放置字符串末尾的连字符和4位数字进入内存缓冲区#1 因此,创建一个可以用backreference 引用的组。

模式内的反向引用使用\n语法指定,其中n是捕获组ID。因此,为了匹配先前在相同模式中匹配的文本,我们可以使用这些反向引用。当您需要检查字符串中的重复值时,它非常有用。比如,您想要验证以相同的2位开头和结尾的字符串:pattern="(\d{2}).*?\1"

<form>
 <input pattern="(\d{2}).*?\1" message="2 digits at the start and end should be identical!" />
 <input type="submit"/>
</form>

此外,您可以利用分组(捕获(...)和非捕获(?:...))来匹配多次出现的特定序列。比如说,您想匹配abc + 3位数的2个序列。您当时使用(abc\d{3}){2}