2016-04-20 20 views
2

下面的片段是从一本书上的HTML5:是否需要在HTML5中使用正则表达式的Parathensis?

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

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

是不是?

+0

直到你想捕捉它,它的无用 – rock321987

+0

括号是正则表达式中的模式。该模式将取代另一个内容。所以它不是数学运算符,它是一种有用的技术。 –

+1

对于这个问题,角色类也是如此。看来这本书的作者只是喜欢括号。该模式可以简化为'\ d {5} - \ d {4}'(大括号是这里唯一有用的)。 – BoltClock

回答

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}

1

圆括号用于捕获组,如果你不使用捕捉组,它的确定将其删除

可以肯定的,我想在这个网站http://www.regexr.com/

+0

我这么认为。但这是HTML5,你如何使用捕获组? –

+0

我正在检查官方文档(W3C),但无法找到如何使用捕获组,我认为它总是需要一些JS来使用它们。 – Pietro

+0

括号可以用于不仅仅是捕获。 – BoltClock