以下代码摘自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}
是不是?
答案 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}
。