问题描述
假设我下面有一些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
)
请注意,在引号内对分隔符的任何特殊转义也可以进行。
只是这里还没完成。