Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取除括号中的词以外的所有匹配词?Regex/Mysql_Mysql_Regex_Rlike - Fatal编程技术网

如何获取除括号中的词以外的所有匹配词?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([^{]*(\{[^}]*\})?)*$'