以下是我的例子:
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}
我需要通过select语句获取数据,例如:
SELECT `id` FROM `table` WHERE `body` REGEXP 'JELLY2'
或许,如果有可能使用RLIKE或其他方式?
SELECT `id` FROM `table` WHERE `body` RLIKE 'JELLY2'
答案 0 :(得分:2)
使用否定的字符类和可以跳过括号输入的组,要求目标不带括号,加上开始/结束锚点:
SELECT id
FROM table
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$'
请参阅live demo。
答案 1 :(得分:1)
虽然你不太可能用MySQL正则表达式做到这一点,并且我认为使用另一种语言会更好地接近它,你可以编写一个MySQL函数来执行此操作。
可能有很多种方法。这个循环遍历needle
中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);