将字符串拆分为多个部分,包括带引号的字符串
Splitting a string into parts, including quoted strings
假设我有这一行:
print "Hello world!" out.txt
我想把它分成:
print
"Hello world!"
out.txt
匹配这些的正则表达式是什么?
注意它们之间必须有一个space。例如,如果我有这个:
print"Hello world!"out.txt
我会得到:
print"Hello
world!"out.txt
我使用的语言是 Haxe。
\s(?![\w!.]+"\s)
一个例子适用于这两种情况,也许有人有更好的解决方案
您可以使用 EReg 在 Haxe 中使用正则表达式 api class:
演示:
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 class API 文档:
http://api.haxe.org/EReg.html
扩展 Mark 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);
}
编辑:
正如评论中指出的那样,如果您的用例是拆分命令行的不同部分,那么最好让解析器处理它,而不是正则表达式。
这些库可能有帮助:
假设我有这一行:
print "Hello world!" out.txt
我想把它分成:
print
"Hello world!"
out.txt
匹配这些的正则表达式是什么?
注意它们之间必须有一个space。例如,如果我有这个:
print"Hello world!"out.txt
我会得到:
print"Hello
world!"out.txt
我使用的语言是 Haxe。
\s(?![\w!.]+"\s)
一个例子适用于这两种情况,也许有人有更好的解决方案
您可以使用 EReg 在 Haxe 中使用正则表达式 api class:
演示: 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 class API 文档:
http://api.haxe.org/EReg.html
扩展 Mark 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);
}
编辑: 正如评论中指出的那样,如果您的用例是拆分命令行的不同部分,那么最好让解析器处理它,而不是正则表达式。
这些库可能有帮助: