sup*_*roi 3 ruby regex mysql activerecord ruby-on-rails
这已经困扰了我一段时间了......我需要查询一个用户表并找到名称中有双空格的用户。我有多个版本的 SQL 查询直接针对数据库工作,最简单和更简洁的是:
SELECT 'first last' REGEXP '[[:space:]]{2}';
Run Code Online (Sandbox Code Playgroud)
我还可以使用 ruby REGEX 使其从 rails 工作:
User.pluck(:full_name).select {|n| n =~ /([[:alpha:]]*)[[:space:]]{2}/ }
Run Code Online (Sandbox Code Playgroud)
或者
User.pluck(:full_name).select {|n| n =~ /\w+\s{2}/ }
Run Code Online (Sandbox Code Playgroud)
我一直在尝试以多种方式使用 AR,但我不确定我错过了什么。也许我需要逃避一些东西......我读了几次:http : //dev.mysql.com/doc/refman/5.0/en/regexp.html
我只是不明白为什么它不起作用
2] pry(main)> User.where("'full_name' REGEXP ?", "[[:alpha:]]*[[:space:]]{2}").count
=> 0
[3] pry(main)> User.where("'full_name' REGEXP ?", '[[:alpha:]]*[[:space:]]{2}').count
=> 0
[4] pry(main)> User.where("'full_name' REGEXP ?", '[[:alpha:]]*[[:space:]]{2}').to_sql
=> "SELECT `users`.* FROM `users` WHERE ('full_name' REGEXP '[[:alpha:]]*[[:space:]]{2}')"
[5] pry(main)> User.where("'full_name' REGEXP ?", '[[:space:]]{2}')
=> []
[6] pry(main)> User.where("'full_name' REGEXP ?", '[[:blank:]]{2}')
=> []
[7] pry(main)> User.where("'full_name' RLIKE ?", '[[:blank:]]{2}')
=> []
[8] pry(main)> User.where("'full_name' RLIKE ?", '[[:blank:]]{2}').to_sql
=> "SELECT `users`.* FROM `users` WHERE ('full_name' RLIKE '[[:blank:]]{2}')"
[9] pry(main)> User.where("'full_name' RLIKE ?", '[[:blank:]]').count
=> 0
[10] pry(main)> User.where("'full_name' RLIKE ?", '[[:space:]]').count
=> 0
[11] pry(main)> User.where("'full_name' RLIKE ?", '.*[[:space:]].*').count
=> 0
[12] pry(main)> User.where("'full_name' RLIKE ?", '\[[:space:]\]').count
=> 0
Run Code Online (Sandbox Code Playgroud)
问题不在于您的正则表达式,而在于您的列名。您问 MySQL文字字符串 'full_name'是否有两个空格。改变这个:
User.where("'full_name' REGEXP ?", '[[:space:]]{2}')
Run Code Online (Sandbox Code Playgroud)
对此:
User.where("full_name REGEXP ?", '[[:space:]]{2}')
Run Code Online (Sandbox Code Playgroud)
在你这样做之后,我认为你的大部分/所有尝试都会奏效。