【问题标题】:Postgresql database search with regex使用正则表达式进行 Postgresql 数据库搜索
【发布时间】:2012-06-23 11:30:49
【问题描述】:

我正在使用带有 VB.NET 和 ODBC (Windows) 的 PostgreSQL 数据库。

我正在通过将 SELECT 与正则表达式相结合来搜索整个单词的句子,如下所示:

"SELECT dtbl_id, name 
   FROM mytable 
  WHERE name ~*'" + "( |^)" + TextBox1.Text + "([^A-z]|$)"  

这在某些情况下搜索得很好,但由于文本中的语法错误(或其他原因),它有时会失败。例如,如果我有句子

比利偶像:白色婚礼

将找到“白色”一词。但是如果我有

白色冲突暴动

然后找不到“white”,因为单词“white”的开头之间没有空格。

最简单的解决方案是将句子:,.\/-=等中的字符临时更改或替换为空格。

这是否可以在单个 SELECT 行中执行以适合与 .NET/ODBC 一起使用?也许在同一个正则表达式中?

如果是,怎么做?

【问题讨论】:

    标签: sql regex postgresql


    【解决方案1】:

    试试这个:

    SELECT 'CLASH-WHITE RIOT' ~ '[[:<:]]WHITE[[:>:]]';
    

    [[:&lt;:]][[:&gt;:]] 分别表示单词的开头和结尾

    更多信息请访问:http://www.postgresql.org/docs/9.1/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP

    【讨论】:

    • 必须小心高 UNICODE 代码点(如日文字母),因为正则表达式引擎对它们不可靠。 Ongoing discussion by the Postgres developers here.
    • 感谢 Szymon,非常有趣。添加一个 ~* 引擎变得不区分大小写,这很好!但是如果我尝试搜索 O'CONNOR 程序崩溃(我认为是 ')。另外,可能是 unicode 问题,如果搜索词包含像 ANDRIĆ 或 MEŠA 这样的斯拉夫字母,则搜索不会返回任何数据(但它应该会导致此类数据存在)。还有什么建议吗?
    • 要处理引用问题,请参阅quote_literal() 函数或使用您的开发环境中可用的任何参数替换技术。要在匹配之前从字符中删除变音符号,请参阅 unaccent 扩展名。 postgresql.org/docs/9.1/interactive/unaccent.html
    • 感谢 kgritin 提供非常有价值的信息。我已经用 tsquery 得到了一些结果。此外,您知道如何将数据句中的“.,;:”等符号视为空格吗?所以我可以从 "MR.JOHN" = MR and JOHN 中得到两个词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2012-07-02
    • 2016-07-19
    • 2014-10-21
    • 2015-09-22
    • 2020-10-04
    相关资源
    最近更新 更多