Регулярное выражение для извлечения имен и параметров функций xgettext из аргументов cli
Я работаю над приложением CLI, которое позволяет пользователю указывать аргумент с именами функций вместе с аргументами. На самом деле он использует тот же синтаксис, что и xgettext
, такие как:
--keywords=__,dgettext:2,dcgettext:2,ngettext:1,2,dpgettext2:2c,3
Мне нужно выяснить регулярное выражение, которое бы разбить это на массив, как это:
['__', 'dgettext:2', 'dcgettext:2', 'ngettext:1,2', 'dpgettext2:2c,3'];
Как я могу это сделать (например, в Javascript)?
Вот что у меня так далеко:
(((?!([0-9\s,])).|^)[a-zA-Z_]+[A-Za-z0-9_]*[:]*([0-9]*[a-z]*,*)*)
Очевидно, у этого есть проблема: он также захватывает запятую каждый раз. Есть идеи, как я могу это оставить?
3 ответа
Основываясь на ответе @Fede, вот полный фрагмент, который делает именно то, что мне нужно:
// The last keyword is invalid - it begins with a number,
// which is not allowed, so it should not considered a separate keyword
var keywords = "__,dgettext:2,dcgettext:2,ngettext:1,2,dpgettext2:2c,3,__,_n,_,2";
keywords.split(/,(?=[a-z_]+\w*)/gi);
Что он делает, так это то, что ищет запятые, за которыми следует правильное ключевое слово, а затем разбивает строку, основанную на этом, на массив, и это именно то, что мне нужно.
Вы можете использовать регулярное выражение с положительным взглядом, используя такое выражение:
,(?=\w+gettext)
var pattern = /(([\w_]+:\w+(,\w+)*)(?=(,[\w_]+:)|(,_+)|($)))|(_+)/g ;
var test = "--keywords=__,dgettext:2,dcgettext:2,nGettext:1,2,dpgettext2:2c,3,N_:1";
var n = test.match(pattern);
alert(n.length);
alert(n);
Это выглядит для символа:hex,(hex). dcgettext:2,2c такой шаблон. Регулярное выражение для моего символа - [\w_+], поэтому шаблон для целого есть. /[\w_]+:\w+(,\w+)*/ где я использую \ w для 'hex'. Я мог бы использовать [0-9a-f]+ для гексагона, который был бы более правильным, но труднее для чтения.
Затем я уточняю, требуя, чтобы за группой следовала либо запятая и другая группа, либо запятая и группа подчеркивания, либо конец строки. Я пишу это как (?=(,[\ W _]+:)|(,_+)($)).
Наконец, я также принимаю отдельные группы подчеркивания как (_+).
Я не знаю, обрабатывает ли это все формы xgettext, я работал только с вашим примером текста. Предоставьте больше текста в качестве примера, если вы хотите лучше использовать регулярные выражения.