Подтвердить что ты не робот

Отрицание обратной ссылки в регулярных выражениях

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

value = "hello and good morning"

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

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

(два\s должны допускать любые пробелы вблизи знака =)

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

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

Однако это не работает.

Это делает:

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

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


РЕДАКТИРОВАТЬ
Цель состояла в основном в том, чтобы получить открывающий тег якоря, который имеет определенное имя класса, включенное в его атрибут класса, и я хотел осветить редкий случай атрибута класса, включая (') или().

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

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

Значение:
Найдите знак-открытый знак.

Разрешить любые пробелы.

Найдите слово a.

Разрешить любой неблокирующий тег.

Найти "класс (любые пробелы) = (любые пробелы)"
Получите открытые кавычки, одно из следующих: ( "или" или "или" или ").

Из ответа Алана Мура: разрешить любые символы, которые не являются открытыми кавычками.

Найти имя класса
Разрешить любые символы, которые не являются открытыми кавычками.

Найдите заключительную цитату, которая совпадает с открытием.

Разрешить любые символы закрывающей метки.

Найдите закрывающий тег char.

4b9b3361

Ответ 1

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

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

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

Ответ 3

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

Используя эти строки:

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. Вы можете выяснить, какой тип кавычек используется для получения первого (или последнего) символа.

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

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