regex - 如何使用正则表达式解析可变长度命令行参数?

标签 regex pcre regex-lookarounds regex-group regex-greedy

我有大量文件,每个文件都包含一个带有可变数量参数的 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 调用。

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

最佳答案

您需要使用\G anchor

/(?|\.\/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'

关于regex - 如何使用正则表达式解析可变长度命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397493/

相关文章:

Java正则表达式将@放入字符类中

c# - 正则表达式前瞻在 .NET 中不起作用

python - 正则表达式重叠包含

python - 查找 pandas 数据框中列的经度和纬度

ruby - 如何编写能够匹配一两行文本的正则表达式

java - 使用 Java Regex,如何检查字符串是否包含集合中的任何单词?

php - 正则表达式 Lookarounds,防止前方和后方

PHP - 用 preg 替换 ereg

php - 需要防止 PHP 正则表达式段错误

javascript - JS 正则表达式匹配方括号中最后一次出现的数字