Pat*_*ick 15 regex postgresql activerecord ruby-on-rails rails-activerecord
我在正常的正则表达式中创建了这个正则表达式
/(first|last)\s(last|first)/i
Run Code Online (Sandbox Code Playgroud)
它匹配前三个
first last
Last first
First Last
First name
Run Code Online (Sandbox Code Playgroud)
我正在尝试获取full_name与我写的正则表达式匹配的所有记录.我正在使用PostgreSQL
Person.where("full_name ILIKE ?", "%(first|last)%(last|first)%")
Run Code Online (Sandbox Code Playgroud)
这是我的尝试.我也尝试过SIMILAR TO和~没有运气
mu *_*ort 39
您的LIKE查询:
full_name ilike '%(first|last)%(last|first)%'
Run Code Online (Sandbox Code Playgroud)
因为LIKE不理解正则表达式分组((...))或者交替(|),LIKE只能理解_单个字符(比如.正则表达式)和%零个或多个字符的任何序列(比如.*正则表达式).
如果你将这种模式交给SIMILAR TO那么你会发现'first last'但是由于案例问题而没有其他模式; 但是,这个:
lower(full_name) similar to '%(first|last)%(last|first)%'
Run Code Online (Sandbox Code Playgroud)
将处理案件问题并找到与正则表达式相同的问题.
如果你想使用一个正则表达式(你可能会这样做,因为LIKE非常有限且繁琐且类似于某些SQL标准小组委员会的狂热思想的奇怪产品)那么你会想要使用不区分大小写的匹配运算符和原始正则表达式:
full_name ~* '(first|last)\s+(last|first)'
Run Code Online (Sandbox Code Playgroud)
这转化为AR的这一点:
Person.where('full_name ~* :pat', :pat => '(first|last)\s+(last|first)')
# or this
Person.where('full_name ~* ?', '(first|last)\s+(last|first)')
Run Code Online (Sandbox Code Playgroud)
我的代码中有一个微妙的变化,你需要注意:我使用单引号作为我的Ruby字符串,你使用的是双引号.反斜线意味着更多的在双引号字符串中比他们在单引号字符串,这样做的'\s'和"\s"是不同的东西.扔几个to_sql电话,你可能会看到一些有趣的东西:
> puts Person.where('full_name ~* :pat', :pat => 'a\s+b').to_sql
SELECT "people".* FROM "people" WHERE (full_name ~* 'a\s+b')
> puts Person.where('full_name ~* :pat', :pat => "a\s+b").to_sql
SELECT "people".* FROM "people" WHERE (full_name ~* 'a +b')
Run Code Online (Sandbox Code Playgroud)
这种差异可能不会导致任何问题,但是当每个人都想使用相同的转义字符时,你需要非常小心你的字符串.就个人而言,我使用单引号字符串,除非我特别需要双引号字符串的额外转义和字符串插值功能.
一些演示:http://sqlfiddle.com/#!15/ 99a2c/6