正则表达式检查用户名中连续出现的句点符号
我必须在我的应用程序中validation用户名,以便它不能包含两个连续的句点符号。 我尝试了以下内容。
username.match(/(..)/)
但发现这匹配“a”。 和“a ..”。 我希望得到nil作为输入“a。”的匹配操作的输出。 我的做法是对的吗?
你需要在句点前放一个\,因为句号是“除换行符之外的任何字符”的保留字符。
所以尝试:
username.match(/(\.\.)/)
简短的回答
你可以使用这样的东西( 参见rubular.com ):
username.match(/\.{2}/)
这个.
通过前面的反斜杠进行转义, {2}
是精确的重复说明符,并且括号被删除,因为在这种情况下不需要捕获。
关于元字符和转义
点,作为模式元字符,匹配(几乎)任何字符。 要匹配文字句点,您至少有两个选项:
- 将点转义为
\.
- 将其匹配为字符类单例
[.]
其他可能需要转义的元字符是|
(轮换), +
/ *
/ ?
/ {
/ }
(重复), [
/ ]
(字符类), ^
/ $
(锚点), (
/ )
(分组),当然还有\
本身。
参考
- regular-expressions.info/Literals和metacharacters , Dot :
.
, 角色等级:[…]
, 锚点:^$
, 重复:*+?{…}
, 轮换:|
, 可选:?
, 分组:(…)
关于有限重复
要匹配两个文字句点,您可以使用例如\.\.
或[.][.]
,即一个简单的连接。 您也可以使用重复结构,例如\.{2}
或[.]{2}
。
有限重复说明符还允许您编写类似x{3,5}
以匹配至少3个但最多5 x
。
请注意,重复具有更高的连接优先级,因此ha{3}
与"hahaha"
不匹配; 它匹配"haaa"
而不是 。 您可以使用像(ha){3}
这样的分组来匹配"hahaha"
。
在分组上
分组(…)
捕获它匹配的字符串,当您想要捕获子模式所做的匹配时,或者如果要将其用作模式的其他部分中的反向引用时,这可能很有用。
如果您不需要此function,则非捕获选项为(?:…)
。 因此像(?:ha){3}
仍像以前一样匹配"hahaha"
,但没有创建捕获组。
如果您实际上不需要分组方面,那么您可以完全省略括号。