2013-08-27 2 views
0

Я создаю эмулятор JS «командной строки».Javascript Regexp и «строковый литерал»

У меня есть регулярное выражение: /([^\s"]+)|"([^\s"]+)"/g. Я хочу совместить отдельные слова, например echo, wyświetl, jd923h90asd8. Кроме того, я хочу сопоставить «строковые литералы» - что-то вроде "this is a string" или "f82h3 23fhn aj293 dgja3 xcn32".

Я использую метод ввода ввода для получения массива всех совпадений. Но проблема такова: , когда Regexp соответствует строковому литералу и возвращает строку в массив, эта строка ВКЛЮЧАЕТ двойные кавычки. Мне не нужны двойные кавычки, но вопрос в том, почему Regexp включает двойные кавычки? В Regexp котировки "" исключены из группы (). Почему Regexp включает все это?

РЕДАКТИРОВАТЬ:

var re = /([^\s"]+)|"([^\s"]+)"/g; 

var process = function (text) { 
    return execute(text.match(re)); 
} 

var execute = function (arr) { 
    console.log(arr); 
    try { 
     //... apply a function with arguments... 
    } catch (e) { 
     error(arr[0]+": wrong function"); 
     return ""; 
    } 
} 

Для ввода echo abc "abc def" "ghi" Regexp возвращает массив ["echo", "abc", "abc", "def", ""ghi""]. Я хочу создать Regexp, чтобы с этого ввода вернется ["echo", "abc", "abc def", "ghi"].

+0

Вы можете продемонстрировать это в действии, возможно, [демо] (http://jsfiddle.net/)? Или, по крайней мере, покажите код, который вы используете в своем вопросе. Боюсь, ваше описание не так ясно, как могло бы быть. Это или еще слишком рано для моего мозга ... –

+0

Хорошо, я добавлю код. –

+0

Возможно, не такая уж плохая идея сохранить котировки. Просто разделите двойные кавычки, когда вам потребуется содержимое строки. Помимо разрешения параметров с пробелами, это также индикатор * type *. В один прекрасный день вы можете решить, что параметры без двойных кавычек могут быть переменными, и в этом случае необходимо было бы отличить строку от возможного имени переменной (другими словами, вы можете захотеть, чтобы 'sort varname' имел другое значение, чем' Сортировка «varname» '. – Neil

ответ

2

Это единственное возможное объяснение. Даже не глядя на какой-либо код.

Использовать group(1) или group(2). Не group() или group(0). Более поздние 2 (которые полностью эквивалентны) всегда возвращают всю согласованную строку, которая в вашем случае включает кавычки. Надеюсь, это объясняет, что происходит.

PS: Поскольку ваш RegEx является «или» RegEx, group(1) и group(2) никогда не будут иметь оба контента одновременно. Один, другой или оба будут пустыми или пустыми. Позднее, когда нет совпадения.

Я только что понял, что вы используете метод match для извлечения всех совпадений в виде массива. В этом случае позвольте мне сказать, что этот метод всегда фиксирует все согласованные строки в каждом случае (эквивалент group(0) выше). Невозможно сообщить об этом другим группам (например, 1 или 2). В результате, у вас есть 3 варианта:

  1. Удалите " S из строк с ними в результирующем массиве через некоторое «после обработки».
  2. Не используйте JavaScript-код match, но создайте свой собственный эквивалент (и используйте group(1) или group(2) в соответствии с корпусом в нем).
  3. Измените свое регулярное выражение так, чтобы оно соответствовало кавычкам как положительные образы и искатели нулевой ширины. Не уверен, что если JavaScript поддерживает это, но это должно быть /([^\s"]+)|(?<=")([^\s"]+)(?=")/g
+0

Где я должен использовать' group (1) 'и' group (2) '? –

+0

Так что я должен делать? –

+0

@AreWojciechowski Обновлен мой ответ. Я не регистрировал, что вы использовали' match 'метод –

2

Котировочная часть вашего регулярного выражения ("([^\s"]+)") не допускает пробелов в пределах цитаты. Попробуйте удалить из него \s. Не могли бы также рассмотреть возможность использования * вместо +, если вам нужно, чтобы соответствовать пустые строки (""):

/([^\s"]+)|"([^"]*)"/g 
+0

ОК, это работает, но что с кавычками? –

+0

Извините, вы говорите, что хотите, чтобы кавычки были включены в полученный результат? –

+0

Нет, я хочу, чтобы цитаты были исключены. С текущим кодом кавычки ВКЛЮЧЕНЫ, и я не хочу их там. –

0

Чтобы соответствовать JavaScript строковых литералов.Вот то, что вы ищете:

/(\w+|("|')(.*?)\2)/g

Чтобы объяснить это: вы либо ищете некотируемые символы слова или совпадение кавычек с чем между ними (например, котировки должны соответствовать правильно, например: "it's his dog" с использованием регулярных выражений обратная ссылка).

Это упрощена быть осторожными, что он не соответствует избежала строки вроде:

"my \"complex\" string"

Он не выглядел, как вы беспокоились о том, что последний сценарий.

http://regexr.com/3bdbi

Смежные вопросы