***.leave this.*** 的 MySQL 正则表达式模式不起作用

标签 mysql

使用什么模式将字符保留在字符串中的点之间 “12395.KS_TH014.001239”,所以如果其动态变量,则只剩下“KS_TH014”。 我尝试了模式“.\K.*?(?=.)”,但它在 mysql 中不起作用(mariadb 10.0.10 服务器)

最佳答案

没有正则表达式组,包括 。然而,可以使用 UDF(用户定义函数)来实现类似的行为:

SELECT REGEX_REPLACE(REGEX_CAPTURE_LEFTMOST('12395.KS_TH014.001239', '[[.period.]].*[[.period.]]'), '[[.period.]]', '');

下面的函数替换字符串中最左边的正则表达式:

DELIMITER $$
CREATE FUNCTION REGEX_REPLACE(var_original VARCHAR(1000), var_pattern VARCHAR(1000),
                                                         var_replacement VARCHAR(1000)) RETURNS VARCHAR(1000)
    COMMENT 'Based on https://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/'
BEGIN
  DECLARE var_replaced VARCHAR(1000) DEFAULT var_original;
  DECLARE var_leftmost_match VARCHAR(1000) DEFAULT
    REGEX_CAPTURE_LEFTMOST(var_original, var_pattern);
    WHILE var_leftmost_match IS NOT NULL DO
      IF var_replacement <> var_leftmost_match THEN
        SET var_replaced = REPLACE(var_replaced, var_leftmost_match, var_replacement);
        SET var_leftmost_match = REGEX_CAPTURE_LEFTMOST(var_replaced, var_pattern);
        ELSE
          SET var_leftmost_match = NULL;
        END IF;
      END WHILE;
  RETURN var_replaced;
END$$

DELIMITER ;

这取决于:

DELIMITER $$
CREATE FUNCTION REGEX_CAPTURE_LEFTMOST(var_original VARCHAR(1000), var_pattern VARCHAR(1000)) RETURNS VARCHAR(1000)
    COMMENT '
  Captures the leftmost substring that matches the [var_pattern]
  IN [var_original], OR NULL if no match.
  '
BEGIN
  DECLARE var_temp_l VARCHAR(1000);
  DECLARE var_temp_r VARCHAR(1000);
  DECLARE var_left_trim_index INT;
  DECLARE var_right_trim_index INT;
  SET var_left_trim_index = 1;
  SET var_right_trim_index = 1;
  SET var_temp_l = '';
  SET var_temp_r = '';
  WHILE (CHAR_LENGTH(var_original) >= var_left_trim_index) DO
    SET var_temp_l = LEFT(var_original, var_left_trim_index);
    IF var_temp_l COLLATE utf8_unicode_ci REGEXP var_pattern COLLATE utf8_unicode_ci THEN
      WHILE (CHAR_LENGTH(var_temp_l) >= var_right_trim_index) DO
        SET var_temp_r = RIGHT(var_temp_l, var_right_trim_index);
        IF var_temp_r COLLATE utf8_unicode_ci REGEXP var_pattern COLLATE utf8_unicode_ci THEN
          RETURN var_temp_r;
          END IF;
        SET var_right_trim_index = var_right_trim_index + 1;
        END WHILE;
      END IF;
    SET var_left_trim_index = var_left_trim_index + 1;
    END WHILE;
  RETURN NULL;
END$$

DELIMITER ;

关于***.leave this.*** 的 MySQL 正则表达式模式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56111404/

相关文章:

mysql - 如何正确使用MySQL索引?

MySql 土耳其语字符

php - 如何使用 in Clause 获取限制记录

PHP + MSSQL 使用命名参数不是 '?' 的 PDO

php - 使用 php 准备好的语句将图像(blob)插入 mysql 数据库

MySQL关系划分

mysql - 从一个选择查询插入多个表的查询

java - 使用 Java 连接到 MySQL

mysql绑定(bind)父子关系查询

MySQL : Group by all weeks of a year with 0 included