MySQL REGEXP匹配字符串与短划线匹配不带破折号的字符串

时间:2017-01-11 19:05:54

标签: mysql regex pattern-matching

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

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

我希望获得string的{​​{1}}行,其匹配的REGEXP仅匹配字母字符和单个短划线(Table1)。

我设法用

来实现
-

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

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

现在,我真正希望获得的是第一个查询结果中的任何some-text my-text no-text yes-dash no-dash ,如果删除了短划线string,那么新字符串会存在于-中。

从示例数据集中,以下内容应为输出

Table

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这似乎很好奇。但这是一种方法:

select t1.*
from table1 t1
where not exists (select 1
                  from table1 tt1
                  where tt1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and
                        t1.string = replace(tt1.string, '-', '')
                 );

编辑:

我认为以上是(返回未连字的版本)。这很容易解决:

select t1.*
from table1 t1
where t1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and
      not exists (select 1
                  from table1 tt1
                  where tt1.string = replace(t1.string, '-', '') and
                        tt1.string not like '%-%'
                 );

答案 1 :(得分:1)

获得行后,可以使用常规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}是多余的(所有术语都有一个隐式量词)。

如果你不熟悉这个用于查找不匹配的习惯用法,那么它的工作原理是因为左连接总是返回一行,但是当没有匹配的行时所有列都是NULL,而where子句(它会触发) 之后进行连接)仅过滤那些行。此外,您不必担心重复,因为没有匹配的连接时只返回1行。