我必须使用正则表达式将命令字符串拆分为段。我正在寻找一个非常基本的解析器来创建一些自定义函数,例如我有这个命令:
rm --remove all --keep some --but-not *.php --or-like "?-imp-*.*"
现在我想将这个字符串拆分成多个段,每个段包含参数名称和值,例如
rm
--remove all
--keep some
--but-not *.php
--or-like "?-imp-*.*"
所以我可以进一步将每个片段从空格中分割出来,并将参数名称和值分开。
我不擅长RegEx。到目前为止,我已编写此正则表达式仅提取参数和值部分,但它与字符串末尾的单词或具有特殊字符的单词(如 *
和 {不匹配{1}}
正则表达式
?
然后我通过
获取命令的名称(?<=\s)--([^--]*)(?=(\s--))
有没有想过这个?
答案 0 :(得分:1)
Javascript中的示例实现:
var match,
str = 'rm --remove all --keep some --but-not *.php --or-like "?-imp\'\'-*.*"',
args = [],
reg = /\s--(\S+)\s+((["']).*?[^\\]\3|\S+)/g;
while ( match = reg.exec( str ) ) {
args.push( [ match[1], match[2] ] );
}
console.log( args );
/*
[ [ "remove", "all" ], [ "keep", "some" ],
[ "but-not", "*.php" ], [ "or-like", ""?-imp-*.*"" ] ]
*/
注意:这不是完全不透水的,而是要求首先验证命令的格式。
已知限制:参数的值不能以引号开头且没有结束引号,例如诸如"
和'n
之类的值将破坏解析。
答案 1 :(得分:1)
使用正则表达式进行解析并不是一个好主意,但正则表达式应该用于标记。
话虽如此,这是一个与您的场景匹配的不完美的正则表达式(但不是所有用例)
在javascript中实现......
str = 'rm --remove all --keep some --but-not *.php --or-like "?-imp-*.*"'
regex = /(^\w+\b|--[\w-]+(\s([\w*.]+|".+?"))?)/g
res = str.match(regex)
// ['rm','--remove all','--keep some','--but-not *.php','--or-like "?-imp-*.*"']
每个项目都需要进一步处理才能分成键和值。
答案 2 :(得分:0)
我会使用为此目的为javascript实现GetOpt的库(否则你正在重新发明轮子):
快速谷歌搜索提出了以下内容:
注意,我没有尝试过这些。