Регулярное выражение для строки в кавычках с кавычками - PullRequest
106 голосов
/ 30 октября 2008

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

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

Ответы [ 15 ]

129 голосов
/ 30 октября 2008
/"(?:[^"\\]|\\.)*"/

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

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

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);
27 голосов
/ 19 июня 2009

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

\"(\\.|[^\"])*\"
14 голосов
/ 28 мая 2012

В ответе ePharaoh ответ:

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

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

/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
8 голосов
/ 09 июня 2015

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

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

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

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

8 голосов
/ 15 декабря 2010
"(?:\\"|.)*?"

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

6 голосов
/ 09 ноября 2015
/"(?:[^"\\]++|\\.)*+"/

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

4 голосов
/ 24 апреля 2017

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

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

Пояснение:

  1. Каждая строка в кавычках начинается с Char: ";
  2. Может содержать любое количество любых символов: .*? {Lazy match}; заканчивающийся не escape-символом [^\\];
  3. Оператор (2) является Lazy (!) Необязательным, поскольку строка может быть пустой (""). Итак: (.*?[^\\])??
  4. Наконец, каждая строка в кавычках оканчивается на Char ("), но ей может предшествовать четное число пар escape-знаков (\\\\)+; и это Greedy (!) необязательно: ((\\\\)+)?+ {Greedy match}, строка может быть пустой или без конечных пар!
3 голосов
/ 30 октября 2008
/(["\']).*?(?<!\\)(\\\\)*\1/is

должно работать с любой строкой в ​​кавычках

1 голос
/ 06 августа 2017

это тот, который работает как с ", так и с", и вы легко добавляете другие в начале.

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

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

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

0 голосов
/ 15 марта 2018

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

Я получил двухэтапное решение, которое превосходит любое сложное регулярное выражение, которое вы можете придумать:

 line = line.replace("\\\"","\'"); // Replace escaped quotes with something easier to handle
 line = line.replaceAll("\"([^\"]*)\"","\"x\""); // Simple is beautiful

Легче читать и, вероятно, более эффективно.

...