[英]MySQL Regex pattern for ***.leave this.*** doesnt work
用什么模式在字符串“12395.KS_TH014.001239”中的點之間留下字符,那么只有“KS_TH014”,如果它的動態變量。 我試過模式“。\\ K。*?(?=。)”但它在mysql中不起作用(mariadb 10.0.10服務器)
沒有正則表達式組,包括mysql-5.7 。 但是,可以使用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 ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.