Вытаскивать данные из котировок?

Я ищу регулярное выражение, которое может извлекать цитируемые разделы в строке, как одинарные, так и двойные кавычки.

IE:

"This is 'an example', \"of an input string\""

Спички:

  • пример
  • входной строки

Я написал это:

 [\"|'][A-Za-z0-9\\W]+[\"|']

Он работает, но кто-нибудь видит в нем недостатки?

Обновлено: Основная проблема, которую я вижу, заключается в том, что он не может обрабатывать вложенные кавычки.

Регулярное выражение, которое вы даете, похоже, совсем не соответствует вашей строке примера. А как насчет пробелов внутри кавычек?

Greg Hewgill 16.10.2008 23:24

Я думаю, вы имеете в виду [\ "'], потому что [\" |'] будет соответствовать | (труба) тоже. Вам не нужно использовать вертикальную черту для выражения «или» в квадратных скобках.

Tomalak 16.10.2008 23:29

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

Jonathan Leffler 17.10.2008 10:41

<stackoverflow.com/questions/171480/…> Конкретно эти ответы: <stackoverflow.com/questions/171480/…> <stackoverflow.com/questions/171480/…>

eyelidlessness 16.10.2008 23:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
3 189
5

Ответы 5

Он работает, но не соответствует другим символам в кавычках (например, не буквенно-цифровым, как двоичные символы или символы иностранного языка). Как насчет этого:

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

Мое регулярное выражение C# немного заржавело, так что полегче со мной, если это не совсем так :)

Это вообще не возвращает никаких совпадений.

FlySwat 16.10.2008 23:23

Я изменил его, чтобы использовать скобки вместо [], так как я думаю, что точка считалась буквальной точкой, а не подстановочным знаком. Я протестировал его на Ruby с вашим примером строки, и, похоже, он им подходит.

Chris Bunch 16.10.2008 23:26

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

Tomalak 16.10.2008 23:28

В этом случае первое совпадение также содержит остаток строки в моей тестовой строке

FlySwat 16.10.2008 23:29

ах, я пропустил это. это регулярное выражение, кажется, работает лучше: просто запишите все, что не является цитатой

Chris Bunch 16.10.2008 23:33

Как это?

"([\"'])(.*?)\1"

Ваше желаемое совпадение будет в подгруппе 2, а тип цитаты - в первой группе.

Недостаток вашего регулярного выражения: 1) жадный "+" и 2) [A-Za-z0-9] на самом деле не очень много соответствует. Многие символы не попадают в этот диапазон.

Я думаю, вы имеете в виду «\ 1», а не «$ 1».

Michael Carman 16.10.2008 23:48

Это уже исправлено. Иногда я немного путаю диалекты регулярных выражений, «$ 1» - это обратная ссылка на реализацию регулярного выражения VBScript.

Tomalak 16.10.2008 23:53

Как он обрабатывает одинарные кавычки внутри двойных кавычек (или наоборот)?

"This is 'an example', \"of 'quotes within quotes'\""

должен соответствовать

  • пример
  • цитат в кавычках

Используйте обратную ссылку, если вам нужно это поддержать.

(\"|')[A-Za-z0-9\\W]+?\1

Обновлено: исправлено использование неохотного квантификатора.

Это не работает для таких строк: "foo foo \" match \ "foo \" match \ "foo", где оно возвращает "\" match \ "foo \" match \ "" как единственное совпадение.

Tomalak 16.10.2008 23:58

Это потому, что \ W - это класс символов без слов, а не класс пробелов, как я думал. Моя память не та, что была раньше.

Bill the Lizard 17.10.2008 00:15

Нет. :-) Это потому, что "+" жадно совпадает с концом строки до того, как произойдет возврат с возвратом, и последняя применимая кавычка дается обратной ссылке "\ 1".

Tomalak 17.10.2008 00:20

И если на то пошло, с "\ s", который у вас теперь есть, он не будет соответствовать пунктуации, диакритическим символам, греческим символам и т. д.

Tomalak 17.10.2008 00:24

Ладно, это моя вина. Я неправильно понял, что должно было быть сопоставлено. Я думал, что это совпадение букв, цифр и пробелов. Так что переход на неохотный квантификатор - вот вам билет.

Bill the Lizard 17.10.2008 00:40

@"(\"|')(.*?)\1"

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

http://renschler.net/RegexBuilder/

Другие вопросы по теме