如何获得除括号中的所有匹配单词?正则表达式/ MySQL的

时间:2016-06-02 08:27:28

标签: mysql regex rlike

以下是我的例子:

JELLY2some text

some text{JELLY2}some textsome textsome text
Sample text for testing:
some textJELLY2 {some text JELLY2 lsdkfjsd}にsome text

我希望获得所有JELLY2,但括号中的内容除外:

{JELLY2}

{some text JELLY2 lsdkfjsd}

http://regexr.com/3dhsl

我需要通过select语句获取数据,例如:

SELECT `id` FROM `table` WHERE `body` REGEXP 'JELLY2'

或许,如果有可能使用RLIKE或其他方式?

SELECT `id` FROM `table` WHERE `body` RLIKE 'JELLY2'

2 个答案:

答案 0 :(得分:2)

使用否定的字符类和可以跳过括号输入的组,要求目标不带括号,加上开始/结束锚点:

SELECT id
FROM table
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$'

请参阅live demo

答案 1 :(得分:1)

虽然你不太可能用MySQL正则表达式做到这一点,并且我认为使用另一种语言会更好地接近它,你可以编写一个MySQL函数来执行此操作。

可能有很多种方法。这个循环遍历needlehaystack的所有出现,检查在出现之前{个字符的数量是否小于或等于}个字符的数量在它之前。这意味着它不是特别健壮(}}}{JELLY2}会使它混淆)但如果这是一个问题,你可以进一步发展这个想法。

DELIMITER //
CREATE FUNCTION contains_text_outside_braces(needle VARCHAR(255), haystack VARCHAR(255))
RETURNS INT DETERMINISTIC
BEGIN
    DECLARE pos INT;
    DECLARE previous INT DEFAULT 1;
    DECLARE length INT DEFAULT LENGTH(needle);
    DECLARE prefix VARCHAR(255);
    LOOP
        SET pos = LOCATE(needle, haystack, previous);
        IF pos = 0 THEN
            RETURN 0;
        END IF;
        SET prefix = LEFT(haystack, pos - 1);
        IF LENGTH(REPLACE(prefix, '{', '')) >= LENGTH(REPLACE(prefix, '}', '')) THEN
            RETURN 1;
        END IF;
        SET previous = pos + length;
    END LOOP;
END//

DELIMITER ;

SELECT * FROM example_table WHERE contains_text_outside_braces('JELLY2', content);