我试图从数据库文本代码中找到匹配的用户名(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/