RegEx \ A \ z不起作用,但这就是Rails 4所需要的

时间:2014-02-14 17:53:09

标签: javascript ruby-on-rails regex ruby-on-rails-4 parsley.js

我最近切换到Rails 4,安全要求似乎不再允许使用/^..$/样式的正则表达式。该错误指出正则表达式应该以/\A..\z/的样式编写。进行此更改似乎解决了我的所有服务器端验证问题,但不幸的是它也破坏了我在javascript中的所有客户端验证。

一个简单的例子。我想验证用户名是字母,数字还是句号。

旧的正则表达式看起来像/^[0-9a-zA-Z.]+$/并且兼顾服务器端(Rails 3.x)和客户端

new RegExp( /^[0-9a-zA-Z.]+$/ ).test('myuser.name') = true

新的正则表达式看起来像/\A[0-9a-zA-Z.]+\z/并且在服务器端工作但客户端失败

new RegExp( /\A[0-9a-zA-Z.]+\z/ ).test('myser.name') = false

所以我显然做错了什么,但我似乎无法找到任何解释。我检查了\ A .. \ z是有效的正则表达式,以确保它不是一些Rails特定的黑客,它似乎是合法的。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

JavaScript在RegExp中不支持\A\z

这是一些原始数据,首先是JavaScript:

var a = "hello\nworld"
(/^world/).test(a) // false
(/^world/m).test(a) // true
(/hello$/).test(a) // false
(/hello$/m).test(a) // true

接下来,对于ruby:

a = "hello\nworld"
a.match(/^world/) # => #<MatchData "world">
a.match(/\Aworld/) # => nil
a.match(/hello$/) # => #<MatchData "hello">
a.match(/hello\z/) # => nil

据此,我们看到ruby的\A\z等同于JavaScript的^$ ,只要您不使用多行{ {1}}修饰符。如果您担心输入有多行,那么您只需要在这两种语言之间翻译这些匹配字符的正则表达式。