RegEx-golf: збігайте весь вміст у рядку


10

Ваше завдання - написати RegEx, який відповідає всім рядкам.

Рядок визначається як усе, що оточене (але не включає) два немальованих ".

А "може бути уникнути \, до якого також можна втекти знову.

Тестові шафи

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Оцінка балів

Найкоротше рішення виграє.

Технічні характеристики

  • Вкажіть, будь ласка, аромат.
  • Вхід буде збалансованим ".
  • Не буде такого, \що безпосередньо передує роздільнику початкового рядка. Наприклад, вам не потрібно було б звертатисяabc\"def"

1
Чи буде \перед струною? Наприклад abc\"def".
jimmy23013

Чи повинен він відповідати кожному рядку в одній групі? Наприклад, чи можу я написати щось, у якому є два збіги, в abc"de"одному є, dа в іншому є e?
jimmy23013

Це дозволено.
Лина монашка

Чи будуть порожні рядки?
Мартін Ендер

Так, будуть порожні рядки.
Лина монашка

Відповіді:


3

PCRE, 21 20 15 19 байт

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

Спробуйте тут.

Це відповідає символу (або початку введення) перед початком подвійної лапки, а потім скидає збіг, щоб переконатися, що подвійна цитата не поділяється з іншою відповідністю.

PCRE, 25 23 байт

Дякуємо Мартіну Бюттнеру за те, що він грає у 2 байти.

(\\.|[^"])*+(?!"(?R)|$)

Спробуйте тут.

Пояснення

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Зауважте, що присвійний кількісний коефіцієнт ( *+) переконався, що негативний пошук завжди починається після цілого рядка або цілого сегмента не рядка.

Є 4 випадки:

  • Матч починається де завгодно поза рядком. \\.Ніколи не відповідатиме подвійній цитаті відповідно до уточнення. Це може закінчитися лише перед наступною подвійною цитатою, яка починається рядок, або кінцем введення. Обидва випадки не спрацьовують негативною позицією.
  • Матч починається на початку рядка. (\\.|[^"])*+відповідатиме повній рядку. Наступний символ повинен бути подвійною цитатою і не може бути кінцем введення. Після подвійної лапки це знаходиться за межами рядка, тому не може бути іншого збігу. Так воно передає негативну лукахед.
  • Матч починається в кінці рядка. Він відповідає порожній рядку так само, як і попередній випадок. Але це не має значення відповідно до уточнення.
  • Матч починається посередині струни. Неможливо, оскільки сірники не перетинаються.

Було б (\\.|[^"])працювати?
Мартін Ендер

@ MartinBüttner, що відповідає всім, окрім ",
Балінт

@ Bálint я мав на увазі ([^\\"]|\\.), а не як повне рішення.
Мартін Ендер

@ MartinBüttner О, гаразд
Bálint

Пропозиція Мартіна має спрацювати, оскільки \\.не вдається лише тоді, коли немає символу після \(або нового символу рядка, але його можна виправити прапором), і цей випадок охоплюється негативним оглядом. Потенційний кількісний коефіцієнт запобігає зворотному відстеженню, тому у нас немає іншого випадку, який слід розглядати.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript, 24 байти

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

Група 1 - це вміст рядка.


Це зовсім не спрацьовує з уникнутими котируваннями, і тому не відповідає вимогам.
Атако

Ага так - вибачте. Як щодо цього?
Хто все, що

Близько, але сигари немає, ви не повинні відповідати зовнішній "s
ATaco

Так, я цього боявся. Я не здогадуюсь це робити в JavaScript, я думаю?
Хто все, що

Ви можете зафіксувати його в підгрупі
ATaco

0

JavaScript, 21 15 13 12 байт

"((\\?.)*?)"

Вміст рядків знаходиться в групі 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.