我试图从数据库文本代码中找到匹配的用户名(sam)的所有提及,内容如下:

$sql = "select * from tweet where feed like '%@sam%'";


这将返回所有提及用户的行。

但是现在的问题是,它还会返回带有@ sam3,@ sam-dadf或@sam之后的任何内容的行。

我怎么能限制这一点,所以从文本中只显示特定的用户名,而不是所有匹配的sam ..以下是数据库中的文本格式,该文本格式插入了供稿行。

 1. i been out with @sam today, but im
    not sure what we should do
 2. we head great party today and all the frineds were invited, such as @sam, @jon, @dan...
 3. i been out today with @samFan and with @dj. << this row should not get pull from database``

最佳答案

是的,请使用REGEXP(或RLIKE),但要注意常见的正则表达式错误,即仅将常见的,否定的字符类(例如[^A-Za-z0-9])查找为所需的“令牌”的结尾-而是使用零-width,“字尾”匹配构造[[:>:]](perl的引擎和其他受启发的正则表达式称为\b)。

否定的字符类在字符串末尾无法匹配:

mysql> SELECT 'I am @sam' REGEXP '@sam[^A-Za-z0-9]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)


单词边界匹配成功的地方:

mysql> SELECT 'I am @sam' REGEXP '@sam[[:>:]]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)


如果[[:>:]]不太适合您的应用程序(因为您的“用户名”字符集不是MySQL regex引擎认为的语言环境中单词边界的一侧),则可以指定一个否定字符类并分别测试字符串结尾:

SELECT ... WHERE (feed REGEXP '@sam[^A-Za-z0-9]' or feed REGEXP '@sam$')

关于sql - sql复杂的表达式@user,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1835472/

10-11 07:50