【问题标题】:Is there a way to extract text matching a regular expression from a column in MySQL?有没有办法从 MySQL 的列中提取与正则表达式匹配的文本?
【发布时间】:2010-07-22 19:00:38
【问题描述】:

例如,如果特定列中的所有条目都具有 [a-z]+[0-9]+ 的形式,那么如何仅提取前导字母,以便 asdf123 和 as3456 返回 'asdf' 和 'as',分别?

【问题讨论】:

标签: mysql


【解决方案1】:

这不适用于 mysql 正则表达式功能(除非安装一些似乎是为此而设计的 udf)。从技术上讲,由于 [0-9] 是一个有限的集合,您可以在 LEAST 中抛出 10 个 LOCATE(注意 & invalitdate 0),并使用 SUBSTRING。不是一张漂亮的照片:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,
  LEAST(
    IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
    IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
    IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
    IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
    IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
    IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
    IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
    IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
    IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
    IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
   ) -1 ) as 'result';
+---------+
| result  |
+---------+
| asjdasd | 
+---------+

如果您需要,请查看 udf。否则,您最好获取字段并在 MySQL 之外对其进行操作。

编辑:如果数字适合整数,肮脏的黑客行为可能会导致:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+

【讨论】:

    【解决方案2】:

    我自己没用过,不过lib_mysqludf_preg library里面可能有一些UDF函数会有所帮助。

    【讨论】:

    • 使用该库,以下选择将起作用:select PREG_REPLACE('/([a-z]+)([0-9]+)/', '$1', 'asdf123');跨度>
    【解决方案3】:

    我没用过,不过回答你的问题:

    MySQL Regex

    来自 MySQL 参考页面:

    SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';
    

    编辑重新考虑(正如下面的 Mark 所指出的),这只会返回文本是否包含在字符串中。不是字符串的匹配部分。

    进一步搜索,这似乎不适用于 MySQL 的基本正则表达式功能。也许查询匹配值然后在 MySQL 之外进行比较可能是答案?

    【讨论】:

    • 这不是他想要的。 REGEXP 只返回 0 或 1,而不是匹配的字符串。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多