如何获取除括号中的所有匹配词? Regex/Mysql

How to get all matching words except those in parentheses? Regex/Mysql

这是我的例子:

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'

尽管您不太可能使用 MySQL 正则表达式来完成此操作,而且我认为使用其他语言会更好,但您 可以 编写 MySQL 函数来执行此操作。

可能有多种方法。这个循环遍历 haystack 中所有出现的 needle,检查出现之前的 { 个字符的数量是否小于或等于 } 个字符的数量在它之前。这意味着它不是特别健壮(}}}{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);

使用否定字符class和可以跳过括号输入的组,要求目标不带括号,加上start/end锚点:

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

live demo