2015-09-07 208 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

編輯: 正如在評論中指出,如果你的使用情況是拆分命令行的不同部分,那麼它應該是最好有一個語法分析器處理它,而不是正則表達式。

這些庫可以幫助:

+0

這似乎工作最好,謝謝!不過,你可能是對的,我一直在想手動解析它可能更好。這些圖書館似乎並不完全符合我的要求;我不是完全分析命令行參數,而是自定義腳本語法。儘管我可以實現自己的一個,但我最初認爲正則表達式可能更有效。一切都一樣,謝謝! – puggsoy

0

regex demo

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

爲例工作了這兩種情況下,也許有人有更多更好的解決方案

2

您可以使用EREG API類使用HAXE正則表達式:

演示: 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 world!」替換''Hello world!''',它會被分成''Hello','to'和'you world!「'。 – puggsoy