我必须在我的应用中验证用户名,以便它不能包含两个连续的句点符号。我尝试了以下内容。
username.match(/(..)/)
但发现这与“a”匹配。和“a ..”。我希望输入“a。”的匹配操作的输出为nil。我的做法是对的吗?
答案 0 :(得分:8)
你需要在句号前放一个\,因为句号是“除换行符之外的任何字符”的保留字符。
所以试试:
username.match(/(\.\.)/)
答案 1 :(得分:6)
你可以使用这样的东西(see on rubular.com):
username.match(/\.{2}/)
.
前缀为反斜杠,{2}
是精确重复说明符,括号被删除,因为在这种情况下不需要捕获。
点,作为模式元字符,匹配(几乎)任何字符。要匹配文字句点,您至少有两个选项:
\.
[.]
可能需要转义的其他元字符是|
(替换),+
/ *
/ ?
/ {
/ }
(重复) ),[
/ ]
(字符类),^
/ $
(主播),(
/ )
(分组),以及当然\
本身。
.
,Character Class: […]
,Anchors: ^$
,Repetition: *+?{…}
,Alternation: |
,Optional: ?
,Grouping: (…)
要匹配两个文字句点,您可以使用例如\.\.
或[.][.]
,即简单连接。您也可以使用重复构造,例如\.{2}
或[.]{2}
。
有限重复说明符还允许您编写类似x{3,5}
to match at least 3 but at most 5 x
的内容。
请注意,重复具有更高的连接优先级,因此ha{3}
与"hahaha"
不匹配; it matches "haaa"
instead。您可以使用(ha){3}
to match "hahaha"
之类的分组。
分组(…)
捕获它匹配的字符串,当您想要捕获子模式所做的匹配时,或者如果您想将其用作模式的其他部分中的反向引用时,这可能很有用。 / p>
如果您不需要此功能,则非捕获选项为(?:…)
。因此像(?:ha){3}
still matches "hahaha"
之类的东西就像以前一样,但没有创建捕获组。
如果您实际上不需要分组方面,那么您可以完全省略括号。