匹配gcc -L编译器参数-表达式,仅当空格之间用撇号引起来时才使用空格

问题描述

假设我下面有一些gcc命令行:

gcc main.c -o main -lwhatever -lsomeother -Lpath/to/whatever -L"/path to the/someotherlib"

如何匹配path/to/whatever"/path to the/someotherlib"(带或不带撇号)?

可能我应该使用一些环顾四周,但是我无法弄清楚到底是怎么回事。

我开始构建类似下面的表达式

(?<=-L)(.*)(?=\s)

然后我添加了撇号:

(?<=-L)"?(.*)"?(?=\s)

结果证明我无法以这种方式解决问题,因为.*会匹配任何字符,并且在后面的外观中与\s发生冲突(也许会消耗掉它,但我认为我什至必须谨慎声明)。

如果我将[^\s]放在.的位置,那么它将不计算表达式是否在撇号之间,匹配将在第一个空白处结束。

解决方法

该值可以通过合并第2组和第3组来获得。

\s-L(?:(["'])((?:(?!\1).)*)\1|(\S*))

https://regex101.com/r/uYnUTA/1
https://regex101.com/r/mBp1eH/1

 \s -L                # whitespace then -L param 
 (?:                  # One of these values
    ( ["'] )             # (1),quote delimiter
    (                    # (2 start)
       (?:                  # content within quotes
          (?! \1 )             # Not a quote
          .                    # this char is ok
       )*                   # do 0 to many
    )                    # (2 end)
    \1                   # backref to quote
  | ( \S* )              # (3),Or,non-quote parameter
 )

请注意,在引号内对分隔符的任何特殊转义也可以进行。
只是这里还没完成。