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

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

 s = ' function(){ return " It\'s 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, ответ

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

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

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

    Чередование « \" и « . Проходит по экранированным кавычкам, в то время как ленивый квантификатор *? гарантирует, что вы не проходите мимо конца строки с кавычками. Работает с classами .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» форму как + и * для предотвращения обратного отслеживания, поскольку заранее известно, что строка без закрывающей цитаты не будет соответствовать ни в коем случае.

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

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

    Объяснение:

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

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

    вот то, что работает с «и», и вы легко добавляете других в начале.

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

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

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

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

    Более обширная версия https://stackoverflow.com/a/10786066/1794894

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

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

    1. Минимальная длина цитаты 50
    2. Экстра-тип котировок (открытые и закрытые)

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

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

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

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

    Опция, которая ранее не касалась:

    1. Переверните строку.
    2. Выполните сопоставление по инвертированной строке.
    3. Переверните свернутые строки.

    У этого есть дополнительный бонус, позволяющий правильно сопоставлять скрытые открытые tags.

    Допустим, у вас была следующая строка; String \"this "should" NOT match\" and "this \"should\" match" Здесь \"this "should" NOT match\" не должно совпадать и "should" должно быть. Кроме того, this \"should\" match должно совпадать, и \"should\" не должно.

    Сначала пример.

     // The input string. const myString = 'String \\"this "should" NOT match\\" and "this \\"should\\" match"'; // The RegExp. const regExp = new RegExp( // Match close '([\'"])(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))' + '((?:' + // Match escaped close quote '(?:\\1(?=(?:[\\\\]{2})*[\\\\](?![\\\\])))|' + // Match everything thats not the close quote '(?:(?!\\1).)' + '){0,})' + // Match open '(\\1)(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))', 'g' ); // Reverse the matched strings. matches = myString // Reverse the string. .split('').reverse().join('') // '"hctam "\dluohs"\ siht" dna "\hctam TON "dluohs" siht"\ gnirtS' // Match the quoted .match(regExp) // ['"hctam "\dluohs"\ siht"', '"dluohs"'] // Reverse the matches .map(x => x.split('').reverse().join('')) // ['"this \"should\" match"', '"should"'] // Re order the matches .reverse(); // ['"should"', '"this \"should\" match"'] 

    Хорошо, теперь объясните RegExp. Это регулярное выражение может быть легко разбито на три части. Следующим образом:

     # Part 1 (['"]) # Match a closing quotation mark " or ' (?! # As long as it's not followed by (?:[\\]{2})* # A pair of escape characters [\\] # and a single escape (?![\\]) # As long as that's not followed by an escape ) # Part 2 ((?: # Match inside the quotes (?: # Match option 1: \1 # Match the closing quote (?= # As long as it's followed by (?:\\\\)* # A pair of escape characters \\ # (?![\\]) # As long as that's not followed by an escape ) # and a single escape )| # OR (?: # Match option 2: (?!\1). # Any character that isn't the closing quote ) )*) # Match the group 0 or more times # Part 3 (\1) # Match an open quotation mark that is the same as the closing one (?! # As long as it's not followed by (?:[\\]{2})* # A pair of escape characters [\\] # and a single escape (?![\\]) # As long as that's not followed by an escape ) 

    Это, вероятно, намного яснее в виде изображения: сгенерировано с помощью Regulex от Jex

    Изображение на github (JavaScript Regular Expression Visualizer.) Извините, у меня нет достаточно высокой репутации, чтобы включать изображения, так что это всего лишь ссылка на данный момент.

    Вот суть примерной функции, использующей эту концепцию, которая немного продвинута: https://gist.github.com/scagood/bd99371c072d49a4fee29d193252f5fc#file-matchquotes-js

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

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

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

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

    Давайте будем гением компьютера.