1

这是我的例子:

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'
4

2 回答 2

2

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

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

现场演示

于 2016-06-02T09:54:08.617 回答
1

尽管您不太可能使用 MySQL 正则表达式来执行此操作,并且我认为使用另一种语言会更好,但您可以编写一个 MySQL 函数来执行此操作。

可能有很多方法。这个循环遍历所有出现的needlein haystack,检查{出现之前的字符数是否小于或等于}它之前的字符数。这意味着它不是特别健壮(}}}{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);
于 2016-06-02T09:12:25.223 回答