正则表达式检查用户名中连续出现的句点符号

我必须在我的应用程序中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" ,但没有创建捕获组。

如果您实际上不需要分组方面,那么您可以完全省略括号。