Alo*_*ain 2 regex ruby-on-rails
我必须在我的应用程序中验证用户名,以便它不能包含两个连续的句点符号.我尝试了以下内容.
username.match(/(..)/)
Run Code Online (Sandbox Code Playgroud)
但发现这匹配"a".和"a ..".我希望输入"a."的匹配操作的输出为nil.我的做法是对的吗?
您需要在句点前面加上\,因为句点是"除换行符之外的任何字符"的保留字符.
所以尝试:
username.match(/(\.\.)/)
Run Code Online (Sandbox Code Playgroud)
你可以使用这样的东西(参见rubular.com):
username.match(/\.{2}/)
Run Code Online (Sandbox Code Playgroud)
将.通过用反斜杠前述转义,{2}是精确的重复说明符,并且由于捕获在这情况下,需要去除括号.
点,作为模式元字符,匹配(几乎)任何字符.要匹配文字句点,您至少有两个选项:
\.[.]可能需要其它逸出元字符是|(交替),+/ */ ?/ {/ }(重复),[/ ](字符类),^/ $(锚),(/ ),当然(分组)\本身.
. , Character Class :[…] , Anchors :^$ , Repetition :*+?{…} , Alternation :| , Optional ::? , 分组:(…)要匹配两个文字句点,您可以使用eg \.\.或[.][.],即简单连接.您也可以使用重复结构,例如\.{2}或[.]{2}.
有限重复说明符还允许您编写x{3,5}匹配至少3但最多匹配5的内容x.
请注意,重复具有更高的连接优先级,因此ha{3}不匹配"hahaha"; 它匹配"haaa"代替.您可以使用(ha){3}匹配的"hahaha"分组.
分组(…)捕获它匹配的字符串,当您想要捕获子模式所做的匹配时,或者如果要将其用作模式的其他部分中的反向引用时,这可能很有用.
如果您不需要此功能,那么非捕获选项就是(?:…).因此,像之前一样(?:ha){3}仍然匹配"hahaha",但没有创建捕获组.
如果您实际上不需要分组方面,那么您可以完全省略括号.