我试图从数据库文本代码中找到匹配用户名(sam)的所有提及,如下所示:
$sql = "select * from tweet where feed like '%@sam%'";
这将返回用户提到的所有行。
但现在的问题是,它还会返回@ sam3,@ sam-dadf或@sam之后的任何行。
我该怎么限制这个,所以只有特定的用户名显示在文本而不是所有匹配的sams ..以下是数据库中的文本格式,插入到Feed行中。
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``
答案 0 :(得分:1)
答案 1 :(得分:1)
是的,使用REGEXP
(或RLIKE
),但请注意寻找所需“令牌”结尾的常见正则表达式错误,因为它只是一个常见的,否定的字符类,如{{ 1}} - 而是使用零宽度,“词尾”匹配构造[^A-Za-z0-9]
(perl的引擎和其他灵感的regexen称为[[:>:]]
)。
否定的字符类在字符串结尾处无法匹配:
\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正则表达式引擎认为是您的语言环境中单词边界的一侧),您可以选择,指定一个否定的字符类,并分别测试字符串结尾:
[[:>:]]
答案 2 :(得分:0)
对不起,但我不熟悉MySql。
在Microsoft SQL Server中,Like子句可以允许您指定不匹配的字段。
例: if('我喜欢@Spam。'LIKE'%@ Spam [^ a-z]%')SELECT 1
答案 3 :(得分:0)
从表格中选择*,其中Feed REGEXP'@ sam [^ A-Za-z0-9]'