如何获取除括号中的词以外的所有匹配词?Regex/Mysql
以下是我的例子:如何获取除括号中的词以外的所有匹配词?Regex/Mysql,mysql,regex,rlike,Mysql,Regex,Rlike,以下是我的例子: JELLY2some text some text{JELLY2}some textsome textsome text Sample text for testing: some textJELLY2 {some text JELLY2 lsdkfjsd}にsome text 我想得到所有的2,除了括号中的那些,如: {JELLY2} 及 我需要通过select语句获取数据,类似于: SELECT `id` FROM `table` WHERE `body` REGE
JELLY2some text
some text{JELLY2}some textsome textsome text
Sample text for testing:
some textJELLY2 {some text JELLY2 lsdkfjsd}にsome text
我想得到所有的2
,除了括号中的那些,如:
{JELLY2}
及
我需要通过select语句获取数据,类似于:
SELECT `id` FROM `table` WHERE `body` REGEXP 'JELLY2'
或者,如果可能的话,用RLIKE或其他方式
SELECT `id` FROM `table` WHERE `body` RLIKE 'JELLY2'
虽然使用MySQL正则表达式不太可能做到这一点,而且我认为最好使用另一种语言,但您可以编写一个MySQL函数来做到这一点 可能有很多种方法。这个循环遍历
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);
使用可以跳过括号内输入的否定字符类和组,以要求目标不带括号,加上起始/结束锚定:
SELECT id
FROM table
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$'
请参阅。您将如何使用
Jelly 2
外支架?代替去除语言是什么?JS?@Wiktor Stribiżew mysql regexp我认为这是不可能的,因为您需要使用断言,而mysql使用POSIX正则表达式时不支持断言。您是否可以选择包含2
的所有结果,然后使用另一种语言过滤掉那些未显示在大括号外的结果?即使这样,这也不是一件小事,因为你可以有多个嵌入的大括号,其中一个大括号中出现关键字,而另一个大括号中却没有关键字{像{this}2}。@Matt Raines谢谢你的评论。它不应该深入到{}的一个级别。但是,你可能是对的,也许,仅仅通过MySQL是不可能的。谢谢。非常感谢,有没有可能也得到这个('some text jelly 2{some text jelly 2 lsdkfjsd}に一些案文“);如果JELLY2在记录中为in{}和out,则也获取其id。可能吗?这不适用于任何包含大括号的字符串,其中2
位于大括号之外。例如,{example}2
@whitesiroi Yes。编辑后的答案与您的示例相符。是的,这样更好。现在它不正确地匹配了{{example}2{example}}
,但是OP说这种情况不太可能发生。@matt regex不能处理递归结构。为此,您需要一个带有AST等功能的完整语言解析器。正则表达式仅限于简单的模式匹配,但正如您所说,这样的边缘情况可以定义为超出范围。
SELECT id
FROM table
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$'