Как получить подстроку " It big \"problem "
с помощью регулярного выражения?
s = ' function(){ return " It\ big \"problem "; }';
Как получить подстроку " It big \"problem "
с помощью регулярного выражения?
s = ' function(){ return " It\ big \"problem "; }';
/"(?:[^"\\]|\\.)*"/
Работает в Regex Coach и PCRE Workbench.
Пример теста в JavaScript:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
Это происходит от nanorc.sample, доступного во многих дистрибутивах linux. Он используется для подсветки синтаксиса строк стиля C
\"(\\.|[^\"])*\"
Как указано в ePharaoh, ответ
/"([^"\\]*(\\.[^"\\]*)*)"/
Чтобы применить вышеизложенное к одиночным кавычкам или двойным кавычкам, используйте
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
"(?:\\"|.)*?"
Чередование \"
и .
проходит через экранированные кавычки, в то время как ленивый квантификатор *?
гарантирует, что вы не проходите мимо конца цитируемой строки. Работает с классами .NET Framework RE
В большинстве предложенных решений используются альтернативные пути повторения, т.е. (A | B) *.
Вы можете столкнуться с переполнением стека на больших входах, поскольку какой-то компилятор шаблонов реализует это с помощью рекурсии.
Java, например: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
Что-то вроде этого:
"(?:[^"\\]*(?:\\.)?)*"
, или тот, который предоставил Гай Бедфорд, уменьшит количество шагов синтаксического анализа, избегая большинства переполнений стека.
/"(?:[^"\\]++|\\.)*+"/
Взято прямо из man perlre
в системе Linux с установленным Perl 5.22.0.
В качестве оптимизации это регулярное выражение использует "posessive" форму как +
, так и *
для предотвращения обратного отслеживания, поскольку заранее известно, что строка без закрывающей цитаты не будет соответствовать ни в коем случае.
/(["\']).*?(?<!\\)(\\\\)*\1/is
должен работать с любой цитируемой строкой
Это работает отлично на PCRE и не падает с StackOverflow.
"(.*?[^\\])??((\\\\)+)?+"
Пояснение:
"
;.*?
{Lazy match}; заканчивающийся символом non escape [^\\]
;(.*?[^\\])??
"
), но ей может предшествовать четное число пар escape-кодов (\\\\)+
; и это Greedy (!) необязательно: ((\\\\)+)?+
{Greedy matching}, строка bacause может быть пустой или без конечных пар!вот то, что работает как с "и", так и с легкостью добавляет других в начале.
("|')(?:\\\1|[^\1])*?\1
он использует обратную ссылку (\ 1), чтобы точно совместить то, что находится в первой группе ( "или" ).
Следует помнить, что регулярные выражения не являются серебряной пулей для всех строк-y. Некоторые вещи проще сделать с помощью курсора и линейного, ручного поиска. A CFL мог бы сделать трюк довольно тривиально, но не так много реализаций CFL (afaik).
Если поиск выполняется с самого начала, возможно, это может работать?
\"((\\\")|[^\\])*\"
Более обширная версия fooobar.com/questions/71005/...
/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|"[^"\\]{50,}(\\.[^"\\]*)*"/
Эта версия также содержит
"
и close "
)Отмечено в regexpal и закончил с этим регулярным выражением: (Не спрашивайте меня, как это работает, я едва понимаю даже tho Я написал это lol)
"(([^"\\]?(\\\\)?)|(\\")+)+"