Сопоставьте аргументы компилятора gcc -L — выражения с пробелами, только если они окружены апострофами

#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
 )
  

Обратите внимание, что также может быть выполнено любое специальное экранирование возможных кавычек-разделителей внутри цитаты.
Просто здесь не сделано.