gpt4 book ai didi

ruby-on-rails - Postgresql 和 ActiveRecord 其中 : Regex matching

转载 作者:行者123 更新时间:2023-11-29 11:11:24 25 4
gpt4 key购买 nike

我在普通正则表达式中创建了这个正则表达式

/(first|last)\s(last|first)/i

它匹配的前三个

first last
Last first
First Last
First name

我正在尝试获取所有 full_name 与我编写的正则表达式匹配的记录。我正在使用 PostgreSQL

Person.where("full_name ILIKE ?", "%(first|last)%(last|first)%")

这是我的尝试。我还尝试了 SIMILAR TO~ 但没有成功

最佳答案

您的 LIKE 查询:

full_name ilike '%(first|last)%(last|first)%'

不会工作,因为 LIKE不理解正则表达式分组 ((...)) 或交替 (|),LIKE 只理解单个字符的 _(例如. 在正则表达式中)和 % 用于零个或多个字符的任何序列(如 .* 在正则表达式中)。

如果您将该模式交给 SIMILAR TO,那么您会找到 'first last' 但由于大小写问题,其他都不会;然而,这:

lower(full_name) similar to '%(first|last)%(last|first)%'

将处理大小写问题并找到与您的正则表达式相同的问题。

如果您想使用正则表达式(您可能会这样做,因为 LIKE 非常有限且麻烦,而 SIMILAR TO 是某些 SQL 标准小组委员会狂热思想的奇怪产物)那么您将需要使用不区分大小写的匹配运算符和您的原始正则表达式:

full_name ~* '(first|last)\s+(last|first)'

这转化为这一点 AR:

Person.where('full_name ~* :pat', :pat => '(first|last)\s+(last|first)')
# or this
Person.where('full_name ~* ?', '(first|last)\s+(last|first)')

您需要注意我的代码中的细微变化:我对 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')

这种差异可能不会给您带来任何问题,但是当每个人都想使用相同的转义字符时,您需要非常小心地处理您的字符串。就个人而言,我使用单引号字符串,除非我特别需要双引号字符串的额外转义和字符串插值功能。

一些演示:http://sqlfiddle.com/#!15/99a2c/6

关于ruby-on-rails - Postgresql 和 ActiveRecord 其中 : Regex matching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com