Прежде всего, я бы предложил сделать это с помощью метода / функции split()
, а не с помощью регулярных выражений. В большинстве языков есть что-то вроде этого, которое вы можете вызвать, чтобы разбить строку на слова (разделенные пробелами), и вы обычно можете указать верхнюю границу для количества частей, на которые вы хотите, чтобы она разбилась. Так в общем,
split('foo bar "multiple word tag"', ' ', 3)
, где 3 обозначает не более 3 частей, будет работать для вашего примера. Вы можете использовать метод / функцию trim()
или strip()
(или написать одну), чтобы удалить любые начальные и конечные кавычки.
Если вы намереваетесь делать это с помощью регулярных выражений, возможно, потому, что каждая строка может иметь переменное количество тегов, в некоторой степени это зависит от того, что именно вы используете для анализа, так как разные движки регулярных выражений иногда имеют разные способы представления одних и тех же вещей. И я не думаю, что это можно сделать с помощью простого старого регулярного выражения; вам понадобится код, чтобы согласиться с ним. Например, вот (псевдо -?) Решение с псевдокодом, использующее Perl-совместимое регулярное выражение (или что-то подобное):
pos = 0;
while pos < length(string):
# match(regular expression, string to search, starting position for the search)
m = match(/\s*(".+?"|\S+)?\s*/, string, pos);
tag = m.group(1).strip('"');
# process the tag
Для чего бы это ни стоило, я, вероятно, сделал бы это с DFA (дискретным конечным автоматом), который проходит через строку символьно-символьно, добавляя каждый из них в буфер и сбрасывая буфер, когда он достигает конца тега. (либо из-за пробела, либо из-за закрывающей кавычки). Может быть, это только я, но я чувствую, что это довольно простая задача анализа, и ее было бы легче понять (на мой взгляд) с точки зрения состояний DFA.