在在线正则表达式测试器中工作的 MariaDB 正则表达式在 SELECT WHERE REGEXP 中不起作用

Posted

技术标签:

【中文标题】在在线正则表达式测试器中工作的 MariaDB 正则表达式在 SELECT WHERE REGEXP 中不起作用【英文标题】:MariaDB regex working in online regex testers does not work in SELECT WHERE REGEXP 【发布时间】:2020-04-03 08:14:08 【问题描述】:

我遇到了一个问题,我收到的数据集格式不正确,例如 EG fullName 列,并且没有名称细分我想搜索以给定字母 EG 'J' 开头的任何名称的位置

这是我的声明,但我只是收到关于意外REGEXP的投诉

SELECT * FROM `Officers` WHERE `fullName` REGEXP '.*\sJ.*';

不幸的是,在 MariaDB 中有什么方法可以做到这一点,名字不是固定的字数,有些只有 2 个名字,有些是 6 个名字长,所以有 4 个中间名。

【问题讨论】:

试试REGEXP '\\bJ' *\sJ* 不是正则表达式,它充其量是一个通配符模式。您的意思是使用 .* 而不是单个星号。 . 匹配任何字符,* 表示零次或多次。至于\s,你/可能/需要转义反斜杠,使整个表达式.*\\s.*J;但你可能想接受 Wiktors 的建议...... 星星之前确实有点我只是在输入 SO 时写错了,请问 \\b 是做什么的我可以看到它的最终结果是什么,但它的定义是什么从未见过以前呢? 其实我有点疑惑:如果只有第一个词必须以J开头,那肯定有非正则表达式的方式来实现你想要的。 \\b 将匹配单词边界,并且可能匹配位于第二个、第三个等名称开头的J。试试WHERE LEFT(TRIM(col), 1) == "J" 第一个以J 开头的单词很容易WHERE fullName LIKE 'J%'WHERE SUBSTRING(fullName, 0, 1) = "J' 但单词边界是困难的一点但是谢谢,我现在已经在正则表达式中了解了\b :) 如果你可以使它成为我将标记为正确的答案:) 【参考方案1】:

你可以使用

REGEXP '\\bJ'
        ^^^

这里,\b 是一个单词边界,仅当 J 前面没有字母、数字或 _ 时才会强制匹配。

\ 加倍,因为正则表达式引擎需要文字 \,并且需要两个反斜杠。

【讨论】:

注意,在 php 中你必须另外转义斜杠,所以像 $db->execute( "SELECT * FROM `Officers` WHERE `fullName` REGEXP '\\\\bJ' " ); 这样的东西可以工作。 如果您需要在正则表达式查询中安全使用字符串,请参阅 php.net/manual/ru/function.preg-quote.php:$q='Unsafe(*abc'; $db->execute( "SELECT * FROM `Officers` WHERE `fullName` REGEXP '\\\\b" . mysqli_real_escape_string($conn, preg_quote($q)) . " ' " );【参考方案2】:

尝试使用类似的东西:

SELECT * FROM `Officers` WHERE `fullName` REGEXP '[[:<:]]J'

参见文档:https://dev.mysql.com/doc/refman/5.7/en/regexp.html

【讨论】:

以上是关于在在线正则表达式测试器中工作的 MariaDB 正则表达式在 SELECT WHERE REGEXP 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式在在线正则表达式测试器中无法在Angular Validators.pattern()中工作

正则表达式搜索 - 在测试人员中工作,而不是在Spyder中[重复]

正则表达式

为在同一文件中工作的多个用户寻求设计建议

正则表达式:输入六位数或六位数以下的正整数。

在线正则表达式可视化测试工具