2015-09-07 3 views
2

Поэтому предположим, у меня есть эта строка:Разбиваем строку на части, в том числе строк в кавычках

print "Hello world!" out.txt 

И я хочу, чтобы разбить его на:

print 
"Hello world!" 
out.txt 

Что бы регулярное выражение, чтобы соответствовать этим ?

Обратите внимание, что между каждым из них должно быть свободное пространство. Например, если у меня было так:

print"Hello world!"out.txt 

Я хотел бы получить:

print"Hello 
world!"out.txt 

язык я использую Haxe.

+1

Что "это"? два первых примера противоречивы. В первом вы заменяете каждое пространство фидом строк, кроме той, что находится в строке, а во втором - вы разбиваете в любое время пространство, независимо от того, находится ли оно в строке или нет. Я что-то упускаю ? –

+2

Регуляторы обычно работают по-разному на разных языках. – melpomene

+0

Где грамматика жетонов? Haxe кажется языком, который может быть скомпилирован на другие языки. Каков ваш целевой язык?Это безрассудно писать регулярное выражение, не зная, что еще вы хотите поддержать с помощью командной строки. – nhahtdh

ответ

2

расширяющейся на ответ Марка KNOL, это должно работать, как и ожидалось для всех ваших тестовых строк:

static function main() { 
    var command = 'print "Hello to you world!" out.txt'; 

    var regexp:EReg = ~/("[^"]+"|[^\s]+)/g; 

    var result = []; 
    var pos = 0; 

    while (regexp.matchSub(command, pos)) { 
     result.push(regexp.matched(0)); 
     var match = regexp.matchedPos(); 
     pos = match.pos + match.len; 
    } 

    trace(result); 
} 

Демо: http://try.haxe.org/#5c0B1

EDIT: Как было отмечено в комментариях, если ваш случай использования, чтобы разделить различные части из командной строки, то она должна быть лучше, чтобы иметь анализатор обрабатывать его, а не регулярное выражение.

Эти ЛИЭС могут помочь:

+0

Это, кажется, работает лучше всего, спасибо! Однако, вероятно, вы правы, я думаю, что ручное разборки, вероятно, лучше. Эти библиотеки, похоже, не делают именно то, что я хочу; Я не разбираю аргументы командной строки точно, а настраиваемый синтаксис сценариев. Я могу реализовать свой собственный для этого, хотя, я только изначально думал, что регулярное выражение может быть более эффективным. Все равно, спасибо! – puggsoy

0

regex demo

\s(?![\w!.]+"\s) 

пример работал на эти два случае, может быть, кто-то есть более лучшее решение

2

Вы можете использовать регулярные выражения в Haxe используя ER апи класс:

Demo: http://try.haxe.org/#76Ea0

class Test { 
    static function main() { 
     var command = 'print "Hello world!" out.txt'; 
     var regexp:EReg = ~/\s(?![\w!.]+")/g; 
     var result = regexp.replace(command, "\n"); 
     js.Browser.alert(result); 
    } 
} 

О Haxe регулярные выражения:
http://haxe.org/manual/std-regex.html

О регулярной замене выражения:
http://haxe.org/manual/std-regex-replace.html

EReg класса API документации:
http://api.haxe.org/EReg.html

+0

Несмотря на то, что это не то, о чем я просил (сопоставляя слова), я могу использовать EReg.split(), чтобы разбить его на каждое слово, что в значительной степени то, что я хочу. Благодаря! – puggsoy

+0

Хм, к сожалению, это работает только в том случае, если строка в кавычках имеет одно пространство. Например, если я заменил «Hello world!» 'На' «Привет вам мир!» 'Он делится на' 'Hello',' to' и 'your world!" '. – puggsoy

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