0

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

rm --remove all --keep some --but-not *.php --or-like "?-imp-*.*"

现在我想将此字符串拆分为多个段,每个段都包含参数名称和值,例如

rm
--remove all
--keep some
--but-not *.php
--or-like "?-imp-*.*"

所以我可以进一步将每个段从空格中分离出来,并将参数名称和值分开。

我不擅长正则表达式。到目前为止,我已经编写了这个正则表达式来仅提取参数和值部分,但它与字符串末尾的单词或带有特殊字符的单词不*匹配?

正则表达式

(?<=\s)--([^--]*)(?=(\s--))

然后我通过

(^\w+)

对此有什么想法吗?

4

3 回答 3

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-*.*"']

每个项目都需要进一步处理以拆分为键和值。

于 2013-01-26T12:58:08.287 回答
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-*.*"" ] ]
 */

注意:这并不是完全无懈可击的,它要求首先验证命令的格式。

已知限制:参数的值可能不以引号开头并且没有右引号,例如,诸如"and之类'n的值会破坏解析。

于 2013-01-26T12:47:44.453 回答
0

为此,我将使用为 javascript 实现 GetOpt 的库(否则你正在重新发明轮子):

一个快速的谷歌搜索带来了以下内容:

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

于 2013-01-26T16:12:36.810 回答