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)
"(([^"\\]?(\\\\)?)|(\\")+)+"