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

时间:2010-08-05 12:32:35

标签: ruby-on-rails regex

我必须在我的应用中验证用户名,以便它不能包含两个连续的句点符号。我尝试了以下内容。

 username.match(/(..)/)

但发现这与“a”匹配。和“a ..”。我希望输入“a。”的匹配操作的输出为nil。我的做法是对的吗?

2 个答案:

答案 0 :(得分:8)

你需要在句号前放一个\,因为句号是“除换行符之外的任何字符”的保留字符。

所以试试:

username.match(/(\.\.)/)

答案 1 :(得分:6)

简短回答

你可以使用这样的东西(see on rubular.com):

username.match(/\.{2}/)

.前缀为反斜杠,{2}是精确重复说明符,括号被删除,因为在这种情况下不需要捕获。


关于元字符和转义

点,作为模式元字符,匹配(几乎)任何字符。要匹配文字句点,您至少有两个选项:

  • \.
  • 为单位逃离
  • 将其匹配为字符类单例[.]

可能需要转义的其他元字符是|(替换),+ / * / ? / { / }(重复) ),[ / ](字符类),^ / $(主播),( / )(分组),以及当然\本身。

参考


有限重复

要匹配两个文字句点,您可以使用例如\.\.[.][.],即简单连接。您也可以使用重复构造,例如\.{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"之类的东西就像以前一样,但没有创建捕获组。

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