MySQL REGEXP 匹配带破折号的字符串,匹配没有破折号的字符串

标签 mysql regex pattern-matching

假设我在 MySQL 数据库中有一个 Table1 表。该表有一个名为 string 的列。这是一个例子:

**Table1**
mytext
my-text
some-text
no-text
notext
yes-dash
yesdash
no-dash

我想从 Table1 中获取 string 的行,这些行与仅匹配字母字符和单个破折号 (-) 的 REGEXP 相匹配.

我设法得到了

SELECT * FROM Table1 WHERE string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$'

从上面的示例数据集,我会回来

some-text
my-text
no-text
yes-dash
no-dash

现在,我真正想得到的是第一个查询结果中的任何 string,如果破折号 - 被删除,那么新字符串会 NOT 存在于 Table 中。

从示例数据集中,以下应该是输出,

 some-text
 no-text
 no-dash

有什么想法吗?

最佳答案

一旦你有了这些行,你就可以使用传统的 SQL 来查找没有非破折号等价物的行:

SELECT a.* 
FROM Table1 a
LEFT JOIN Table1 b
  ON b.string = REPLACE(a.string, '-', '')
WHERE a.string REGEXP '^[A-Za-z]+-[A-Za-z]+$'
AND b.string IS NULL

另请注意正则表达式的简化,因为 [-] 与普通 - 相同,而 {1} 是多余的(所有术语都有一个隐式量词 1)。

如果您不熟悉这个用于查找不匹配项的惯用语,它是有效的,因为左连接总是返回一行,但是当没有匹配的行时所有列都是 NULL,并且 where 子句(在连接完成后 触发)仅过滤那些行。此外,您不必担心重复,因为在没有匹配的联接时只会返回 1 行。

关于MySQL REGEXP 匹配带破折号的字符串,匹配没有破折号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41598778/

相关文章:

php - 将 iOS 应用程序连接到连接到当前在线网站的 mysql 数据库

regex - PostgreSQL 正则表达式

regexp_matches 在 plpgsql 函数中返回 NULL

python - PyQt5 QSqlTableModel 不更新对数据库的更改

MYSQL SQLSTATE[42000] : Syntax error or access violation: 1064

mysql - 按时间戳将 MySQL 表重组为多行

python - 可选地在表达式中与 Python 正则表达式匹配?

java - 使用正则表达式关闭打开的 XML 标签

java - 此模式与输入 123456789.2.2.2 匹配,但不应匹配

rust - 如何匹配 `&(&usize, &u32)` 之类的模式?