#regex #gcc #arguments #whitespace #apostrophe
#регулярное выражение #ссагпз #аргументы #пробелы #апостроф #gcc
Вопрос:
Предположим, что у меня есть какая-то командная строка 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
ним в lookbehind (возможно, он его потребляет, но я думаю, что мне даже нужно быть осторожным с этим утверждением).
Если я вставлю [^s]
вместо .
, то не будет учитываться, находится ли выражение между апострофами или нет, совпадение закончится на первом пробеле.
Комментарии:
1. Не могу сделать это таким образом. Здесь есть 2 разные вещи, их нельзя объединить в обобщении. Это означает, что по крайней мере 2 группы захвата. И утверждения смехотворны, поскольку вам просто нужно объединить 2 группы, чтобы получить содержимое.
Ответ №1:
Значение может быть получено путем объединения групп 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
)
Обратите внимание, что также может быть выполнено любое специальное экранирование возможных кавычек-разделителей внутри цитаты.
Просто здесь не сделано.