Что должно случиться с "a" b "c"
?
Обратите внимание, что в подстроке " b "
пробелы находятся между кавычками.
- редактировать -
Я предполагаю, что пробел находится "между кавычками", если ему предшествует нечетное количество стандартных кавычек (то есть U + 0022, я проигнорирую эти забавные "кавычки" Юникода).
Это означает, что вам нужно следующее регулярное выражение: ^[^"]*("[^"]*"[^"]*)*"[^"]* [^"]*"[^"]*("[^"]*"[^"]*)*$
("[^"]*"[^"]*)
представляет пару кавычек. ("[^"]*"[^"]*)*
- четное количество кавычек, ("[^"]"[^"]*)*"
- нечетное количество. Затем есть фактическая часть строки в кавычках, за которой следует другое нечетное количество кавычек. ^$
якоря нужны, потому что вам нужно посчитать каждую кавычку с начала строки. Это решает проблему с подстрокой " b "
выше, никогда не просматривая подстроки. Цена заключается в том, что каждый символ в вашем входе должен сопоставляться со всей строкой, что превращает это в операцию разделения O (N * N).
Причина, по которой вы можете сделать это в регулярном выражении, заключается в том, что требуется ограниченный объем памяти. Эффективно только один бит; «Я видел нечетное или четное количество цитат до сих пор?». На самом деле вам не нужно сопоставлять отдельные пары ""
.
Однако это не единственная возможная интерпретация. Если вы включаете “funny Unicode quotes”
, который должен быть в паре, вам также нужно иметь дело с ““double quoted””
строками. Это, в свою очередь, означает, что вам нужно количество открытых “
, что означает, что вам нужно бесконечное хранилище, что, в свою очередь, означает, что это больше не обычный язык, что означает, что вы не можете использовать регулярное выражение. QED.
В любом случае, даже если бы это было возможно, вы все равно хотели бы иметь правильный анализатор. Поведение O (N * N) для подсчета количества кавычек, предшествующих каждому символу, просто не смешно. Если вы уже знаете, что перед Str [N] есть X кавычек, то для определения количества кавычек, предшествующих Str [N + 1], нужно указать O (1), а не O (N). Возможные ответы, в конце концов, просто X или X + 1!