2016-06-02 2 views
1

Вот пример у меня есть:Как получить все совпадающие слова, кроме тех, что указаны в круглых скобках? 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} 

http://regexr.com/3dhsl

Мне нужно получить данные sele ct, что-то вроде:

SELECT `id` FROM `table` WHERE `body` REGEXP 'JELLY2' 

Может быть, если это возможно с RLIKE или каким-либо другим способом?

SELECT `id` FROM `table` WHERE `body` RLIKE 'JELLY2' 
+1

Что вы собираетесь делать с 'JELLY2' вне брекетов? Заменить? Удалить? Какой язык? JS? –

+0

@Wiktor Stribiżew mysql regexp – whitesiroi

+1

Я не думаю, что это возможно, потому что вам нужно будет использовать утверждения, которые не поддерживаются в MySQL, поскольку он использует регулярные выражения POSIX. Можете ли вы выбрать все результаты, содержащие 'JELLY2', а затем использовать другой язык для фильтрации тех, где он не отображается за пределами фигурных скобок? Даже тогда это не тривиально, потому что у вас может быть несколько встроенных фигурных скобок, где ключевое слово появляется внутри одного, а не другого {например {this} JELLY2}. –

ответ

2

Используйте отрицание класса символов и группы, которые могут пропустить через квадратные скобки ввода, чтобы потребовать, чтобы цель не с кронштейнами, плюс начальный/конечные якоря:

SELECT id 
FROM table 
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$' 

См live demo.

+0

Большое спасибо, возможно ли получить это тоже («некоторый текстJELLY2 {некоторый текст JELLY2 lsdkfjsd} に некоторый текст»); Если JELLY2 находится в {}, а в записи также получить свой идентификатор. Является ли это возможным? – whitesiroi

+0

Это не работает для любой строки, содержащей фигурные скобки, где 'JELLY2' находится за пределами фигурных скобок. Например, '{example} JELLY2'. –

+0

@matt это правильно, но я над этим работаю ... – Bohemian

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); 
Смежные вопросы