我想在sqlite中使用正则表达式,但是我不知道怎么做。

我的表中有一列包含这样的字符串:“ 3,12,13,14,19, 28,32“
现在,如果我输入” where x LIKE'3'“,我也会得到包含13或32这样的值的行,但我只想获得具有完全相同的行该字符串中的值3。

有人知道如何解决这个问题吗?

评论

此答案是将REGEXP函数添加到c#中的sqlite的最佳方法stackoverflow.com/a/26155359/5734452

#1 楼

SQLite3支持REGEXP运算符:

WHERE x REGEXP <regex>


http://www.sqlite.org/lang_expr.html#regexp

评论


我找到了一种简单的方法:只是\ bx \ b,其中x是要在字符串中寻找的值:)

–科迪
2011年2月21日23:06

@DanS:如何添加regex()函数来支持REGEXP运算符?默认情况下,未添加用户功能。

– SK9
2011年6月9日下午4:54

根据Sqlite文档:REGEXP运算符是regexp()用户函数的一种特殊语法。默认情况下,没有定义regexp()用户函数,因此使用REGEXP运算符通常会导致错误消息。如果在运行时添加了名为“ regexp”的应用程序定义的SQL函数,则将调用该函数以实现REGEXP运算符。 (sqlite.org/lang_expr.html#regexp)

–radicand
2012年1月7日在0:49



对于我们这些在尝试此操作时出错的人,请查看stackoverflow.com/a/18484596/1585572下面的响应,我将代码放入文件中,并将其导入到Firefox sqlite管理器中的用户定义函数中。但是,您需要稍微不同地调用它,例如:SELECT * FROM table WHERE column regexp(“ myregexp”)

– Tristan
2014年5月30日17:16



这是如何被接受的答案?请在stackoverflow.com/a/8338515/828885下查看mivk的更高评分的答案。

– akhan
9月2日,0:24

#2 楼

正如其他人已经指出的那样,REGEXP调用了一个用户定义的函数,该函数必须首先定义并加载到数据库中。也许某些sqlite发行版或GUI工具默认包含它,但是我的Ubuntu安装没有。解决方案是

sudo apt-get install sqlite3-pcre


,它在/usr/lib/sqlite3/pcre.so的可加载模块中实现Perl正则表达式

要使用它,必须加载每次您打开数据库时都可以使用它:

.load /usr/lib/sqlite3/pcre.so


或者您也可以将该行放入~/.sqliterc中。

现在您可以像这样查询:

SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';


如果要直接从命令行查询,可以使用-cmd开关在SQL之前加载库:

sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"


如果您使用的是Windows,我想类似的.dll文件应该在某处可用。

评论


另一个加载选项:我使用以下命令创建了一个视图:SELECT load_extension('/ usr / lib / sqlite3 / pcre.so');这样,当我使用基于GUI的DB入口点(如Firefox中的SQLite Manager)时,便可以加载REGEXP功能。

– Paulb
2012年5月22日10:39



#3 楼

一种无需正则表达式的解决方法是where ',' || x || ',' like '%,3,%'

评论


是的,我是这样想的,但是并不是每次都在“,”之前或之后。不管怎么说,还是要谢谢你 :-)

–科迪
11年2月21日在22:01

我并没有在这里遇到问题-我想知道这是否可行,因为x是列名...

–科迪
2011-2-21在22:24

您应该使用','|| x || ','

–巴鲁克
2011年7月21日在7:27

#4 楼

SQLite默认情况下不包含正则表达式功能。

它定义了REGEXP运算符,但是除非您或您的框架定义了一个名为regexp()的用户函数,否则它将失败并显示一条错误消息。如何执行此操作将取决于您的平台。

如果定义了regexp()函数,则可以从逗号分隔的列表中匹配任意整数,如下所示:

... WHERE your_column REGEXP "\b" || your_integer || "\b";


但是,实际上,如果您通过用逗号分隔列表中的每个数字用单独的行替换单个列中的那些组来规范化数据库结构,就会发现要容易得多。这样,您不仅可以使用=运算符代替正则表达式,而且可以使用SQL提供的更强大的关系工具(如联接)。

#5 楼

PHP / PDO中的SQLite UDF,用于模拟MySQL中的行为的REGEXP关键字:

$pdo->sqliteCreateFunction('regexp',
    function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS')
    {
        if (isset($pattern, $data) === true)
        {
            return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0);
        }

        return null;
    }
);


u修饰符未在MySQL中实现,但我发现它对默认拥有它。示例:

SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');


如果$data$pattern为NULL,则结果为NULL-就像在MySQL中一样。

#6 楼

我使用sqlite3在python中的解决方案:

   import sqlite3
   import re

   def match(expr, item):
        return re.match(expr, item) is not None

   conn = sqlite3.connect(':memory:')
   conn.create_function("MATCHES", 2, match)
   cursor = conn.cursor()
   cursor.execute("SELECT MATCHES('^b', 'busy');")
   print cursor.fetchone()[0]

   cursor.close()
   conn.close()


如果正则表达式匹配,则输出将为1,否则为0。

#7 楼

我不愿意回答将近一年前发布的问题。但是我是为那些认为Sqlite本身提供REGEXP函数的人写的。

在sqlite中调用函数REGEXP的一个基本要求是“您应该在应用程序中创建自己的函数,然后提供指向sqlite驱动程序的回调链接”。
为此,您必须使用sqlite_create_function(C接口)。您可以在这里和这里找到详细信息

#8 楼

使用python,假设con是与SQLite的连接,则可以通过编写以下内容来定义所需的UDF:

con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)


这里是一个更完整的示例:

import re
import sqlite3

with sqlite3.connect(":memory:") as con:
    con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
    cursor = con.cursor()
    # ...
    cursor.execute("SELECT * from person WHERE surname REGEXP '^A' ")




评论


恕我直言,检查应该是x不是Null,y不是Null并re.search(x,y)否则将抛出异常。

–磷脂
19-10-23在16:06

#9 楼

UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'


和:

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'


#10 楼

详尽的or'ed where子句无需字符串连接即可完成操作:

WHERE ( x == '3' OR
        x LIKE '%,3' OR
        x LIKE '3,%' OR
        x LIKE '%,3,%');


包括以下四种情况:完全匹配,列表结尾,列表开头和中间列表。

这比较冗长,不需要regex扩展名。

#11 楼

您可以将正则表达式与REGEX一起使用,但这是进行精确匹配的愚蠢方法。

您应该只说WHERE x = '3'

评论


我应该更好地解释它(对不起我的英语不好),我的意思是仅是一个确切的值,而不是确切的字符串。不管怎么说,还是要谢谢你!

–科迪
2011-2-21在22:09

#12 楼

考虑使用此

WHERE x REGEXP '(^|,)(3)(,|$)'


当x处于x时,它将恰好匹配3:


3
12,13,3
12,3,13

其他示例:

WHERE x REGEXP '(^|,)(3|13)(,|$)'


这将匹配3或13

#13 楼

如果有人在为Android Sqlite寻找非正则表达式条件,例如此字符串[1,2,3,4,5],那么不要忘了在@phyatt条件中添加与括号({})等其他特殊字符相同的方括号([])

WHERE ( x == '[3]' OR
        x LIKE '%,3]' OR
        x LIKE '[3,%' OR
        x LIKE '%,3,%');


#14 楼

如果您使用的是php,则可以使用以下命令将任何函数添加到sql语句中:SQLite3 :: createFunction。
在PDO中,您可以使用PDO :: sqliteCreateFunction并在您的语句中实现preg_match函数:

了解Havalite的工作方式(使用Php在SqLite中使用RegExp)

评论


在MySQL REGEXP函数中,您无需在模式中指定定界符或修饰符。

– Alix Axel
13年8月28日在9:51

#15 楼

您还可以考虑

WHERE x REGEXP '(^|\D{1})3(\D{1}|$)'


这将允许在任何位置的任何字符串中找到数字3

#16 楼

在Julia中,可以遵循的模型如下所示:

using SQLite
using DataFrames

db = SQLite.DB("<name>.db")

register(db, SQLite.regexp, nargs=2, name="regexp")

SQLite.Query(db, "SELECT * FROM test WHERE name REGEXP '^h';") |> DataFrame


#17 楼

用于导轨

             db = ActiveRecord::Base.connection.raw_connection
            db.create_function('regexp', 2) do |func, pattern, expression|
              func.result = expression.to_s.match(Regexp.new(pattern.to_s, Regexp::IGNORECASE)) ? 1 : 0
            end