Отрицание обратной ссылки в регулярных выражениях - PullRequest
38 голосов
/ 08 ноября 2011

, если строка имеет этот прогнозируемый формат:

value = "hello and good morning"

Где "(кавычки) также может быть" (одинарная кавычка), а закрывающий символ ('или ") будет таким же, какоткрывая одинЯ хочу сопоставить строку между кавычками.

\bvalue\s*=\s*(["'])([^\1]*)\1

(две \ s разрешают пробелы возле знака =)

Первая «захваченная группа» (внутрипервая пара скобок) - должно соответствовать открывающей кавычке, которая должна быть либо ', либо' затем - я должен разрешить любое количество символов, которые не были зафиксированы в первой группе, а затем я ожидаю, что символ, захваченный вgroup (заключенные в кавычки).

(обязательная строка должна быть записана во второй группе захвата).Это не работает, хотя.

Это делает:

\bvalue\s*=\s*(['"])([^"']*)["']

, но я хочу убедиться, что и кавычка открытия и закрытия (либо двойная, либо одинарная) одинаковы.

EDIT Цель состояла в том, чтобы в основном получить открывающий тег якоря, у которого есть определенное имя класса, включенное в его атрибут класса, и я хотел охватить редкий случай атрибута класса, включающего (') или (()).

Следуя всем приведенным здесь советам, я использовал шаблон:

<\s*\ba\b[^<>]+\bclass\s*=\s*("|'|\\"|\\')(?:(?!\1).)*\s*classname\s*(?:(?!\1).)*\1[^>]*>

Значение :Найдите метку-открытый знак.Разрешить любые пробелы.Найдите слово a.Разрешить любой не закрывающий тег.Найти "класс (любые пробелы) = (любые пробелы)"Получить вводные кавычки, одно из следующих: ("или" или \ "или \ ').Из ответа Алана Мура: разрешите любые символы, которые не являются открывающими кавычками.найти имя классаРазрешить любые символы, которые не являются открывающими кавычками.Найдите заключительную цитату, которая совпадает с открытием.Разрешить любые символы раскрывающихся тегов.Найдите закрывающий тег char.

Ответы [ 3 ]

59 голосов
/ 09 ноября 2011

Вместо отрицательного класса символов вы должны использовать отрицательный запрос:

\bvalue\s*=\s*(["'])(?:(?!\1).)*\1

(?:(?!\1).)* потребляет один символ за раз, после просмотр подтвердил, чтоперсонаж не соответствует тому, что было найдено группой захвата, (["'']).Класс символов, отрицательный или нет, может соответствовать только одному символу за раз.Насколько известно движку регулярных выражений, \1 может представлять любое количество символов, и нет никакого способа убедить его в том, что \1 будет содержать только " или ' в этом случае.Таким образом, вы должны пойти на более общее (и менее читаемое) решение.

3 голосов
/ 08 ноября 2011

Вы можете использовать:

\bvalue\s*=\s*(['"])(.*?)\1

Смотри

1 голос
/ 08 ноября 2011

Не зная, для чего вам нужна информация (или даже того, на каком языке или инструменте вы используете это регулярное выражение), я могу предложить множество путей.

Использование этих строк:

value = "hello and good morning"
value = 'hola y buenos dias'
value = 'how can I say "goodbye" so soon?'
value = 'why didn\'t you say "hello" to me this morning?'
value = "Goodbye! Please don't forget to write!"
value = 'Goodbye! Please don\'t forget to write!'

это выражение:

"((\\"|[^"])*)"|'((\\'|[^'])*)'

будет соответствовать следующим строкам:

"hello and good morning"
'hola y buenos dias'
'how can I say "goodbye" so soon?'
'why didn\'t you say "hello" to me this morning?'
"Goodbye! Please don't forget to write!"
'Goodbye! Please don\'t forget to write!'

При экранировании будет разрешено использовать либо другой тип цитаты, либо тот же тип цитаты.с одним предшествующим \.Содержимое строк в кавычках находится в группе 1 или 3. Вы можете выяснить, какой тип кавычек используется, получив первый (или последний) символ.

Если вам нужно, чтобы некоторые из этих вещей были впо конкретным группам соответствия, приведите более конкретные примеры (и включите вещи, которые не должны работать, но выглядят так, как будто они могут быть близко)

Пожалуйста, спросите, хотите ли вы пойти по этому маршруту и ​​вам нужна дополнительная помощь

...