首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用regex解析可变长度命令行参数?

如何使用regex解析可变长度命令行参数?
EN

Stack Overflow用户
提问于 2019-05-31 23:02:16
回答 2查看 107关注 0票数 2

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

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

代码语言:javascript
复制
./some_script.sh http://some.server.com -p a=value -p b=value -p c=value

示例对应的API调用

代码语言:javascript
复制
http://some.server.com/api/some/endpoint?a=value&b=value&c=value

我的问题是,我似乎不能对每个参数进行分组,因为参数的数量是可变的。

基本正则表达式(这将与上面的示例匹配,但只有group first参数):

代码语言:javascript
复制
.\/some_script.sh\s([\w\/:\.]*)(\s-\w\s[\w=]*)

我试过了:

代码语言:javascript
复制
.\/some_script.sh\s([\w\/:\.]*)(\s-\w\s[\w=]*)*

但是,这似乎只对最后一个参数进行了分组。(使用regex101进行测试)

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

如果需要更多细节,请让我知道,任何建议都是欢迎的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-31 23:11:56

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

代码语言:javascript
复制
.+\.sh.+?(https?:\/\/[^\s]*)|\s+-[a-z]+\s+([\w=]+)

这里有我们的链接:

代码语言:javascript
复制
(https?:\/\/[^\s]*)

和我们的变量在:

代码语言:javascript
复制
([\w=]+)

用逻辑OR修改的。

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

DEMO

测试

这段代码只是显示了捕获组是如何工作的:

代码语言:javascript
复制
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可视化正则表达式:

票数 1
EN

Stack Overflow用户

发布于 2019-05-31 23:28:23

您需要使用\G锚点

代码语言:javascript
复制
/(?|\.\/some_script\.sh\s([\w\/:.]*)|(?!^)\G())\s-(\w)\s([\w=]*)/

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

扩展

代码语言:javascript
复制
 (?|                           # 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'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56397493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档