【问题标题】:MariaDB regex working in online regex testers does not work in SELECT WHERE REGEXP在在线正则表达式测试器中工作的 MariaDB 正则表达式在 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 :) 如果你可以使它成为我将标记为正确的答案:)

标签: regex search mariadb


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多