Regex для строки с кавычками

Как получить подстроку " It big \"problem " с помощью регулярного выражения?

s = ' function(){  return " It\ big \"problem  ";  }';     

Ответ 1

/"(?:[^"\\]|\\.)*"/

Работает в Regex Coach и PCRE Workbench.

Пример теста в JavaScript:

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);

Ответ 2

Это происходит от nanorc.sample, доступного во многих дистрибутивах linux. Он используется для подсветки синтаксиса строк стиля C

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

Ответ 3

Как указано в ePharaoh, ответ

/"([^"\\]*(\\.[^"\\]*)*)"/

Чтобы применить вышеизложенное к одиночным кавычкам или двойным кавычкам, используйте

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

Ответ 4

"(?:\\"|.)*?"

Чередование \" и . проходит через экранированные кавычки, в то время как ленивый квантификатор *? гарантирует, что вы не проходите мимо конца цитируемой строки. Работает с классами .NET Framework RE

Ответ 5

В большинстве предложенных решений используются альтернативные пути повторения, т.е. (A | B) *.

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

Java, например: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993

Что-то вроде этого: "(?:[^"\\]*(?:\\.)?)*", или тот, который предоставил Гай Бедфорд, уменьшит количество шагов синтаксического анализа, избегая большинства переполнений стека.

Ответ 6

/"(?:[^"\\]++|\\.)*+"/

Взято прямо из man perlre в системе Linux с установленным Perl 5.22.0. В качестве оптимизации это регулярное выражение использует "posessive" форму как +, так и * для предотвращения обратного отслеживания, поскольку заранее известно, что строка без закрывающей цитаты не будет соответствовать ни в коем случае.

Ответ 7

/(["\']).*?(?<!\\)(\\\\)*\1/is

должен работать с любой цитируемой строкой

Ответ 8

Это работает отлично на PCRE и не падает с StackOverflow.

"(.*?[^\\])??((\\\\)+)?+"

Пояснение:

  • Каждая строка с кавычками начинается с Char: ";
  • Он может содержать любое количество символов: .*? {Lazy match}; заканчивающийся символом non escape [^\\];
  • Оператор (2) является Lazy (!) необязательным, потому что строка может быть пустой (""). Итак: (.*?[^\\])??
  • Наконец, каждая строка с кавычками заканчивается на Char ("), но ей может предшествовать четное число пар escape-кодов (\\\\)+; и это Greedy (!) необязательно: ((\\\\)+)?+ {Greedy matching}, строка bacause может быть пустой или без конечных пар!

Ответ 9

вот то, что работает как с "и", так и с легкостью добавляет других в начале.

("|')(?:\\\1|[^\1])*?\1

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

http://www.regular-expressions.info/backref.html

Ответ 10

Следует помнить, что регулярные выражения не являются серебряной пулей для всех строк-y. Некоторые вещи проще сделать с помощью курсора и линейного, ручного поиска. A CFL мог бы сделать трюк довольно тривиально, но не так много реализаций CFL (afaik).

Ответ 11

Если поиск выполняется с самого начала, возможно, это может работать?

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

Ответ 12

Более обширная версия fooobar.com/questions/71005/...

/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|"[^"\\]{50,}(\\.[^"\\]*)*"/   

Эта версия также содержит

  • Минимальная длина цитаты 50
  • Дополнительные типы котировок (open " и close ")

Ответ 13

Отмечено в regexpal и закончил с этим регулярным выражением: (Не спрашивайте меня, как это работает, я едва понимаю даже tho Я написал это lol)

"(([^"\\]?(\\\\)?)|(\\")+)+"