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