如何获取除括号中的所有匹配词? 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}
我需要通过 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([^{]*(\{[^}]*\})?)*$'
这是我的例子:
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'
尽管您不太可能使用 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([^{]*(\{[^}]*\})?)*$'