Advertisement
krot

regex_replace

Nov 7th, 2016
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 6.06 KB | None | 0 0
  1. select reg_replace2('---hhggh---hhj','^[^а-яa-z0-9]+','',TRUE,1,0)
  2. DELIMITER $$
  3.  
  4. CREATE FUNCTION reg_replace2(
  5. subject VARCHAR(21845),
  6. pattern VARCHAR(21845),
  7.       replacement VARCHAR(21845),greedy BOOLEAN, minMatchLen INT, maxMatchLen INT)
  8.     RETURNS VARCHAR(21845) DETERMINISTIC BEGIN
  9.       DECLARE result, subStr, usePattern VARCHAR(21845);
  10.       DECLARE startPos, prevStartPos, startInc, len, lenInc INT;
  11.       IF subject REGEXP pattern THEN
  12.         SET result = '';
  13.         -- Sanitize input parameter values
  14.         SET minMatchLen = IF(minMatchLen < 1, 1, minMatchLen);
  15.         SET maxMatchLen = IF(maxMatchLen < 1 OR maxMatchLen > CHAR_LENGTH(subject),
  16.                              CHAR_LENGTH(subject), maxMatchLen);
  17.         -- Set the pattern to use to match an entire string rather than part of a string
  18.         SET usePattern = IF (LEFT(pattern, 1) = '^', pattern, CONCAT('^', pattern));
  19.         SET usePattern = IF (RIGHT(pattern, 1) = '$', usePattern, CONCAT(usePattern, '$'));
  20.         -- Set start position to 1 if pattern starts with ^ or doesn't end with $.
  21.         IF LEFT(pattern, 1) = '^' OR RIGHT(pattern, 1) <> '$' THEN
  22.           SET startPos = 1, startInc = 1;
  23.         -- Otherwise (i.e. pattern ends with $ but doesn't start with ^): Set start position
  24.         -- to the min or max match length from the end (depending on "greedy" flag).
  25.         ELSEIF greedy THEN
  26.           SET startPos = CHAR_LENGTH(subject) - maxMatchLen + 1, startInc = 1;
  27.         ELSE
  28.           SET startPos = CHAR_LENGTH(subject) - minMatchLen + 1, startInc = -1;
  29.         END IF;
  30.         WHILE startPos >= 1 AND startPos <= CHAR_LENGTH(subject)
  31.           AND startPos + minMatchLen - 1 <= CHAR_LENGTH(subject)
  32.           AND !(LEFT(pattern, 1) = '^' AND startPos <> 1)
  33.           AND !(RIGHT(pattern, 1) = '$'
  34.                 AND startPos + maxMatchLen - 1 < CHAR_LENGTH(subject)) DO
  35.           -- Set start length to maximum if matching greedily or pattern ends with $.
  36.           -- Otherwise set starting length to the minimum match length.
  37.           IF greedy OR RIGHT(pattern, 1) = '$' THEN
  38.             SET len = LEAST(CHAR_LENGTH(subject) - startPos + 1, maxMatchLen), lenInc = -1;
  39.           ELSE
  40.             SET len = minMatchLen, lenInc = 1;
  41.           END IF;
  42.           SET prevStartPos = startPos;
  43.           lenLoop: WHILE len >= 1 AND len <= maxMatchLen
  44.                      AND startPos + len - 1 <= CHAR_LENGTH(subject)
  45.                      AND !(RIGHT(pattern, 1) = '$'
  46.                            AND startPos + len - 1 <> CHAR_LENGTH(subject)) DO
  47.             SET subStr = SUBSTRING(subject, startPos, len);
  48.             IF subStr REGEXP usePattern THEN
  49.               SET result = IF(startInc = 1,
  50.                               CONCAT(result, replacement), CONCAT(replacement, result));
  51.               SET startPos = startPos + startInc * len;
  52.               LEAVE lenLoop;
  53.             END IF;
  54.             SET len = len + lenInc;
  55.           END WHILE;
  56.           IF (startPos = prevStartPos) THEN
  57.             SET result = IF(startInc = 1, CONCAT(result, SUBSTRING(subject, startPos, 1)),
  58.                             CONCAT(SUBSTRING(subject, startPos, 1), result));
  59.             SET startPos = startPos + startInc;
  60.           END IF;
  61.         END WHILE;
  62.         IF startInc = 1 AND startPos <= CHAR_LENGTH(subject) THEN
  63.           SET result = CONCAT(result, RIGHT(subject, CHAR_LENGTH(subject) + 1 - startPos));
  64.         ELSEIF startInc = -1 AND startPos >= 1 THEN
  65.           SET result = CONCAT(LEFT(subject, startPos), result);
  66.         END IF;
  67.       ELSE
  68.         SET result = subject;
  69.       END IF;
  70.       RETURN result;
  71. END$$
  72.  
  73. DELIMITER ;
  74.  DROP FUNCTION IF EXISTS reg_replace2;
  75.  SELECT txt,
  76.            reg_replace(txt,
  77.                        'q.*k b.*n',
  78.                        'slow red',
  79.                        TRUE,
  80.                        5,
  81.                        0
  82.                        ) AS test1,
  83.            reg_replace(txt,
  84.                        '[Tt][^ ]* ',
  85.                        'a ',
  86.                        TRUE,
  87.                        2,
  88.                        0
  89.                        ) AS test2,
  90.            reg_replace(txt,
  91.                        '^[Tt][^ ]* ',
  92.                        'a ',
  93.                        TRUE,
  94.                        2,
  95.                        0
  96.                        ) AS test3,
  97.            reg_replace(txt,
  98.                        'd.*g$',
  99.                        'cat',
  100.                        TRUE,
  101.                        2,
  102.                        0
  103.                        ) AS test4,
  104.            reg_replace(txt,
  105.                        '[[:space:]]+', -- See http://stackoverflow.com/questions/15558172#15558268
  106.                        '_',
  107.                        TRUE,
  108.                        1,
  109.                        0
  110.                        ) AS test5,
  111.            reg_replace(txt,
  112.                        'l.+',
  113.                        'log',
  114.                        TRUE,
  115.                        2,
  116.                        0
  117.                        ) AS test6,
  118.            reg_replace(txt,
  119.                        '^Th.*og$',
  120.                        'No foxes or dogs here!',
  121.                        TRUE,
  122.                        4,
  123.                        0
  124.                        ) AS test7
  125.     FROM test;
  126.  
  127.  
  128. DELIMITER $$
  129.  
  130. CREATE FUNCTION  `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000))
  131. RETURNS VARCHAR(1000)
  132. DETERMINISTIC
  133. BEGIN
  134.  DECLARE temp VARCHAR(1000);
  135.  DECLARE ch VARCHAR(1);
  136.  DECLARE i INT;
  137.  SET i = 1;
  138.  SET temp = '';
  139.  IF original REGEXP pattern THEN
  140.   loop_label: LOOP
  141.    IF i>CHAR_LENGTH(original) THEN
  142.     LEAVE loop_label;  
  143.    END IF;
  144.    SET ch = SUBSTRING(original,i,1);
  145.    IF NOT ch REGEXP pattern THEN
  146.     SET temp = CONCAT(temp,ch);
  147.    ELSE
  148.     SET temp = CONCAT(temp,replacement);
  149.    END IF;
  150.    SET i=i+1;
  151.   END LOOP;
  152.  ELSE
  153.   SET temp = original;
  154.  END IF;
  155.  RETURN temp;
  156. END$$
  157.  
  158. DELIMITER ;
  159.  
  160.  
  161. select regex_replace('[^a-zA-Z0-9\-]','','2my test3_text-to. check \\ my- sql (regular) ,expressions ._,');
  162.  
  163. Demo http://sqlfiddle.com/#!9/5e5c1/1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement