我有大量文件,每个文件包含一个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调用。
如果需要更多详细信息,请告诉我,欢迎提出任何建议。
答案 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。
如果需要的话,我们还可以修改和添加其他边界或减小边界。
此代码段仅显示捕获组的工作方式:
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}`);
});
}
jex.im可视化正则表达式: