javascript - RegExp\A\z 不起作用,但这正是 Rails 4 所需要的

标签 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 的 hack,而且它看起来是合法的。

有什么想法吗?

最佳答案

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的^$ 只要您不使用多行 m 修饰符。如果您担心输入有多行,您只需针对这些匹配字符在这两种语言之间翻译正则表达式。

关于javascript - RegExp\A\z 不起作用,但这正是 Rails 4 所需要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21786218/

相关文章:

JavaScript 内存限制

Javascript 模块模式范围与此

ruby-on-rails - SQLite是否足够好?

Javascript 在生成的 HTML 中,但没有一个 javascript 有效

ruby-on-rails - rails 在 View 中使用路由/命名助手

ios - 快速验证允许所有字母,但不能包含特殊字符或数字

Ruby 扫描标签,除非被 unescaped\

regex - 在vim中的空格后轻松对齐字符

javascript - AJAX成功调用后多次调用?

javascript - 如何连接多个数字?