尽管您不太可能使用 MySQL 正则表达式来执行此操作,并且我认为使用另一种语言会更好,但您可以编写一个 MySQL 函数来执行此操作。
可能有很多方法。这个循环遍历所有出现的needle
in 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);