Ruby on rails 验证的\u格式\u以排除某些模式

Ruby on rails 验证的\u格式\u以排除某些模式,ruby-on-rails,regex,validation,Ruby On Rails,Regex,Validation,我想要一个rails模型来排除某些模式:两个或更多空间的运行 User.name=“Harry Junior Potter”有效,但User.name=“Harry Junior Potter”无效(在Harry和Junior之间有两个空格)。 这是为了避免身份盗用,因为这两个名称显示相同(HTML压缩空白) 换句话说:允许的是:[0-9A-z_-]和“\s仅在一个序列中” 我的正则表达式太差,无法创建这样的regexp,这是我所拥有的(带有负数,但它不正确匹配) /([0-9A-z_\-])

我想要一个rails模型来排除某些模式:两个或更多空间的运行

User.name=“Harry Junior Potter”
有效,但
User.name=“Harry Junior Potter”
无效(在Harry和Junior之间有两个空格)。 这是为了避免身份盗用,因为这两个名称显示相同(HTML压缩空白)

换句话说:允许的是:
[0-9A-z_-]
和“
\s
仅在一个序列中”

我的正则表达式太差,无法创建这样的regexp,这是我所拥有的(带有负数,但它不正确匹配)

 /([0-9A-z_\-])(\s(?!\s))?/

注意:before\u验证钩子已经剥离了所有元素,因此字符串开头或结尾的空格都不是问题。

用“”替换“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”不是更容易吗 我的Ruby不是很流利,但应该是

User.name.replace!("  ", " ") while User.name.contains("  ")
然后你可以用这个正则表达式来检查剩下的

([\w\-]+\s?)+

我会建议一个替代路线。事实上,这是一个非常奇怪的路线。如果你在时间紧迫的情况下,不想在现有的表中增加一列,那么我会建议创建一个用户名的slug。我知道这对你的问题来说有点过分。但我更喜欢这样做。而不是根据alr检查新用户名我已经存储了一个(并且对那些乱七八糟的正则表达式感到头晕目眩),我只需对照存储的slug检查新的slug(顺便说一句,它可以为您处理所有乱七八糟的正则表达式)。您可以签出以查看slug

slug主要用于过滤URL中的危险字符。为什么不使用slug检查用户名呢?它也处理unicode字符

这并不是对你问题的直接回答,但我面临着和你一样的情况,因为时间紧迫,我决定使用Slug

在我的控制台中进行一次简单的检查可以得到:

>> "Harry Junior Potter".to_slug
=> "harry-junior-potter"
>> "Harry  Junior  Potter".to_slug
=> "harry-junior-potter"
>> "Harry         Junior           Potter".to_slug
=> "harry-junior-potter"
>> "Harry(junior(potter))".to_slug
=> "harry-junior-potter"
>> "Harry_Junior_Potter".to_slug
=> "harry_junior_potter"

因此,现在,如果且仅当slug验证了允许用户存储其名称。

首先,
[A-z]
是一个错误。它相当于

[A-Z\[\\\]^_`a-z]
…我很确定这不是你想的。你必须分别拼出这两个范围:
[A-Za-z]
。但在这种情况下,你也要匹配数字和下划线,所以你可以像@Sjuul那样使用
\w
[\w-]+
。这使你的正则表达式

/^[\w-]+(?: [\w-])*$/

当然,这将匹配像
-
这样的愚蠢的东西,并且它不会匹配很多真实的名字。我只是回答你关于名字之间只允许一个空格的问题。

确实是一个好办法:将所有空格压缩成一个。然后验证处理程序可以查找重复的名字:“哈利·波特”将变成“Harry_Potter”,可能已经存在。小细节:我不能简单地寻找文本空间,因为在UTF8中有许多形式的空格(包括制表符、换行符等),您可以使用
gsub
来代替:
User.name.gsub!(/\s+/,“”)
。这将在折叠的同时将其他空白转换为空格。顺便说一句,制表符和换行符是ASCII字符,因此
\s
将匹配它们。有很多非ASCII空白字符,但它们不必存在于名称中;我只是不允许它们。我喜欢这个想法。它允许我存储任何内容用户已插入,但使用我希望使用的已验证值。这样,您可以在将来更改验证并使其向后兼容。必须这样做的唯一缺点是在数据库中有一个额外的列。这只是一个折衷问题(时间与存储)。如果你手头有足够的时间,请使用正则表达式检查。如果不使用slug,我个人会尽可能远离正则表达式。不过,如果你计划不使用上述解决方案,我建议退出。这样可以更容易地测试你的正则表达式。我儿子不太理解你所说的“slug”是什么意思,而且很多真名都不匹配“。我现在故意省略了重音和非ascii字符,以关注双空格问题。(在这之后,第一个瘦gmy应用程序必须做的是接受我自己的名字,Bèr:)这正是我的意思。我只是想阻止(任何人)对与空格无关的问题发表任何评论。”。