我可以使用正则表达式解析可变长度的命令行参数吗?

时间:2019-05-31 15:02:16

标签: regex pcre regex-group

我有大量文件,每个文件包含一个bash命令,其中包含数量可变的参数。我需要将它们替换为相应的API调用。

文件中的bash命令示例(注意:'-p'参数的数量有所不同,有些则没有):

./some_script.sh http://some.server.com -p a=value -p b=value -p c=value

对应的API调用示例

http://some.server.com/api/some/endpoint?a=value&b=value&c=value

我的问题是,鉴于参数的数量是可变的,我似乎无法对每个参数进行分组。

基本正则表达式(这将与上面的示例匹配,但仅对第一个参数进行分组):

.\/some_script.sh\s([\w\/:\.]*)(\s-\w\s[\w=]*)

我尝试过:

.\/some_script.sh\s([\w\/:\.]*)(\s-\w\s[\w=]*)*

但是,这似乎仅将最后一个参数分组。 (已通过regex101测试)

理想情况下,我希望此正则表达式能够在这些文件中对无限数量的参数进行分组,以便我可以轻松地将其重建为API调用。

如果需要更多详细信息,请告诉我,欢迎提出任何建议。

2 个答案:

答案 0 :(得分:2)

您需要使用\ G锚点

/(?|\.\/some_script\.sh\s([\w\/:.]*)|(?!^)\G())\s-(\w)\s([\w=]*)/

https://regex101.com/r/0151qC/1

扩展

 (?|                           # Branch reset
      \. /some_script \. sh         # First, find the script name
      \s 
      ( [\w/:.]* )                  # (1), url

   |                              # or,
      (?! ^ )
      \G                            # Start where last left off
      ( )                           # (1), blank url

 )

 \s - 
 ( \w )                        # (2), - 'p'
 \s 
 ( [\w=]* )                    # (3), 'a=value'

答案 1 :(得分:1)

在这里,也许我们可以找到另一种方法,然后逐步从输入中收集所需的数据。然后,我们可能会从类似于以下内容的表达式开始

.+\.sh.+?(https?:\/\/[^\s]*)|\s+-[a-z]+\s+([\w=]+)

在这里有我们的链接:

(https?:\/\/[^\s]*)

和以下变量:

([\w=]+)

更改为逻辑OR。

如果需要的话,我们还可以修改和添加其他边界或减小边界。

DEMO

测试

此代码段仅显示捕获组的工作方式:

const regex = /.+\.sh.+?(https?:\/\/[^\s]*)|\s+-[a-z]+\s+([\w=]+)/gm;
const str = `./some_script.sh http://some.server.com -p a=value -p b=value -p c=value
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

RegEx电路

jex.im可视化正则表达式:

enter image description here