【问题标题】:SQL regex words with space带空格的 SQL 正则表达式单词
【发布时间】:2016-11-29 19:35:12
【问题描述】:

我有一个代码:

$phrase = "hello";

SELECT (...) WHERE x RLIKE '[[:<:]]$phrase[[:>:]]'

但是当我想搜索结尾有空格的短语时:

$phrase = "hello ";

搜索不返回任何内容

我该如何解决?

【问题讨论】:

  • 对不起,如果您不需要检查单词边界,为什么还要使用 RLIKE?使用LIKE '%$phrase%'。另外,你为什么使用xregexp 标签(JavaScript 之一)?
  • 因为我想搜索一个词组作为一个词
  • 是的,但“你好”不是一个词。它是一个带空格的词。空格不是单词的一部分。
  • 请为这个项目定义“单词边界”。

标签: php mysql sql regex


【解决方案1】:

对于 MySql,您应该使用 [[:space:]] 来查找空白

"SELECT * FROM some_table WHERE some_field REGEXP '$phrase[[:space:]]'"

但是,如果您的 $phrase 中已经包含一个空格,那么只需:

"SELECT * FROM some_table WHERE some_field like '%$phrase%'"

我不确定在 php 中如何将 $phrase 的值分配到字符串中,但就 sql 部分而言,它应该可以工作

【讨论】:

  • 我认为他希望能够输入一个已经包含空格的短语,并让它在查询中工作。但我可能是错的。
  • @TimBiegeleisen - 我相信你是对的 - 我不擅长 php,所以我只留下与他给出的示例匹配的部分(更喜欢提供字符串连接以构建查询:))
【解决方案2】:

如果你想匹配一个最终字符代表短语结尾的模式,那么你可以使用$正则表达式分隔符:

SELECT ...
FROM yourTable
WHERE x REGEXP $phrase . '$'

假设短语是"hello ",您想要匹配的正则表达式将是hello $

【讨论】:

  • 不。我只是想搜索一个词组作为一个词,它也将能够搜索一个包含空格的词组
  • @user6638766 是的。这就是我的答案应该做的。
  • @Tim 你很清楚你的答案不是“做”那个。 $ 匹配字符串的结尾。
  • @WiktorStribiżew 事情令人困惑,因为查询本身将出现在 PHP 代码中。我怀疑您正在阅读我按字面意思写的内容,当然这对 MySQL 没有任何意义。我想说的是,如果他想匹配以空格结尾,他应该使用$
【解决方案3】:

[[:&gt;:]] 是一个尾随字边界。当您传递"hello " 时,生成的模式是'[[:&lt;:]]hello [[:&gt;:]]',这意味着它将匹配“hello”后跟一个尾随的单词边界——这永远不会发生,因为空格不是单词字符。

这里用边界这个词没有意义,用LIKE

SELECT (...) WHERE x LIKE '%$phrase%'

SELECT (...) WHERE x LIKE CONCAT('%', $phrase, '%')

如果您仍想确保您的搜索短语不会出现在单词字符之间,请使用

SELECT (...) WHERE x RLIKE CONCAT('(^|[^[:alpha:]])', $phrase, '($|[^[:alpha:]])')

另一种出路:只保留[[:&lt;:]] 前导 字边界,并删除尾随 [[:&gt;:]] 一个。

【讨论】:

    【解决方案4】:

    在使用 $phrase 之前,做

    $phrase = trim($phrase);
    

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2011-09-09
      • 2022-01-14
      相关资源
      最近更新 更多