与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用

Posted

技术标签:

【中文标题】与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用【英文标题】:SQLite SELECT not working in Ruby when used with regex capture string, but works with string literal 【发布时间】:2011-07-08 20:33:47 【问题描述】:

我正在使用以下正则表达式来捕获以匹配 IRC PART 消息:

:(?<nick>[a-zA-Z\d<\-\[\]\\^_]+)!(.+)@(.+) PART (?<chan>[#&][^\x07\x2C\s]0,200) :(.+)

它正确匹配并捕获组,因为运行此代码时:

part_regex.match resp do |m|
    puts "#m[:nick] has parted."
    puts db.execute("SELECT * FROM users WHERE nick = ?", m[:nick])
end

第一个puts 有效,并输出正确的字符串。但是第二个puts 没有输出任何东西。我知道表格中存在尼克捕获。每当我使用文字字符串而不是 m[:nick] 时,它都可以正常工作。我正在使用sqlite3-ruby Gem 来操作数据库。

这是收到 PART 消息时的完整输出:

>> :mark!~mark@Mark-Szymanskis-MacBook.local PART #testing :mark
mark has parted.

【问题讨论】:

尝试删除记录而不是选择它,如果记录被删除,请检查数据库。 @user482594 那也行不通。 我认为使用#query 会起作用,但它仍然不起作用。 投反对票的人能解释一下吗? 【参考方案1】:

我决定使用字符串插值而不是占位符。

 db.execute("SELECT * FROM users WHERE nick = '#SQLite3::Database.quote m[:nick]'")

【讨论】:

【参考方案2】:

一些数据库,例如 ActiveRecord 允许使用“?”来防止 SQL 注入。作为占位符。我不确定您使用的是什么数据库库,但它可能不支持这种类型的字符串插值。即使有,它可能仍然需要有“?”用单引号括起来。

【讨论】:

围绕 ?用单引号给我一个错误:/Users/mark/.rvm/gems/ruby-1.9.2-p180/gems/sqlite3-1.3.3/lib/sqlite3/statement.rb:41:in 'bind_param': bind or column index out of range (SQLite3::RangeException)。另外,我说我在我的问题中使用了sqlite-3 ruby​​ 库。 另外,我很确定情况并非如此,因为用文字字符串替换 m[:nick] 效果很好。 您可以尝试通过“#to_s”方法将结果对象显式转换为字符串。它可能是 MatchData 类:m[:nick].to_s,或 "#m[:nick]" 当使用#m[:nick] 将字符串直接放入查询中时,它可以工作。但我宁愿不必这样做以防止 SQL 注入。

以上是关于与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 格式字符串中的捕获类型说明符

正则表达式之补获性分组与非补获性分组

正则表达式非捕获分组与具名分组

正则表达式非捕获分组与具名分组

在 Python 中使用正则表达式识别和捕获文本时遇到问题

正则表达式:如何在捕获单个组时匹配整个字符串 [重复]