在查找引号内的字符时模式匹配失败

时间:2011-09-13 07:43:08

标签: mysql regex replace

我在MySQL DB中的列数据中盯着这个:

<sxyz lang="en" class="multilang">Encyclopedia</sxyz>

我需要像

一样
Encyclopedia</sxyz>
切掉第一部分。现在我可以在两者之间有空格,我想说明这一点。

假设myfielddata是上面的字符串......

我试过了:

select replace(myfielddata,'<sxyz[[:space:]]+lang="[a-zA-Z0-9_-]+"[[:space:]]+class="multilang">','')   from mytable

它不起作用。

我将事件配对到最低限度,以匹配“en”,只有

select replace(myfielddata,'<sxyz lang="[a-zA-Z0-9_-]+" class="multilang">','')   from mytable

它仍然不起作用。

如果我完全匹配字符串

,唯一可行的方法
select replace(myfielddata,'<sxyz lang="en" class="multilang">','')   from mytable

但这并没有考虑到其间可能出现的任何额外空格。

请RegEx guru帮忙。

一个。

2 个答案:

答案 0 :(得分:1)

MySQL没有任何基于正则表达式的替换函数,only regular expression based matching,特别是replace只替换文字字符串。

你必须用locatesubstr(或类似的东西)来做这件事:

mysql> select substr('<sxyz lang="en" class="multilang">Encyclopedia</sxyz>' from locate('>', '<sxyz lang="en" class="multilang">Encyclopedia</sxyz>') + 1) as truncated;
+---------------------+
| truncated           |
+---------------------+
| Encyclopedia</sxyz> |
+---------------------+

当然,您需要确保字符串与所需的模式匹配,然后才能将它们放到上面的字符串管理器中,并且可以使用正则表达式。

答案 1 :(得分:-1)

试试这个

select replace(myfielddata,'<sxyz.*"multilang">','')

select replace(myfielddata,'^<sxyz.*"multilang">$','')