在在线正则表达式测试器中工作的 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()中工作