如何使用正则表达式拆分命令字符串

时间:2013-01-26 11:23:08

标签: regex

我必须使用正则表达式将命令字符串拆分为段。我正在寻找一个非常基本的解析器来创建一些自定义函数,例如我有这个命令:

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--))

有没有想过这个?

3 个答案:

答案 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的库(否则你正在重新发明轮子):

快速谷歌搜索提出了以下内容:

注意,我没有尝试过这些。