如何避免提取属于正则表达式组的最后一个特定字符?

How to avoid extracting last specific character in which is part of regex group?

给定一个命令行

mycommand --optional-arguments their-values <patternOfInterestWithDirectoryPath> arg1 arg2

patternOfInterestWithDirectoryPath 可以是以下任何一个

path/to/dir
/path/to/dir
path/to/dir/
"path/to/dir"
"/path/to/dir"
"path/to/dir/"

在上述任何一项中,要求在所有情况下提取 /path/to/dir,其中一些可能(或可能不)用双引号引起来,and/or 可能(或可能不)领先 /

以下正则表达式确实匹配,但它也提取了最后一个正斜杠。

 \S*mycommand\s+(?:-\S+\s+)*\"?([^\"]+)\/?\"?.*

像这样附加负面前瞻是行不通的

 \S*mycommand\s+(?:-\S+\s+)*"?([^\s"]+(?!\/"))\/?"?.*

任何线索如何忽略作为正则表达式组的一部分但在特定位置(例如最右边)的要提取的字符?

您可以使用

\S*mycommand\s+(?:-\S+\s+)*(?|"([^"]*?)\/?"|(\S+)(?<!\/)).*

regex demo详情:

  • \S* - 零个或多个非空白字符
  • mycommand - 文字字符串
  • \s+ - 一个或多个空格
  • (?:-\S+\s+)* - - 出现零次或多次,一个或多个非空格,一个或多个空格
  • (?|"([^"]*?)\/?"|(\S+)(?<!\/)) - branch reset group 匹配:
    • "([^"]*?)\/?" - ",第 1 组捕获除 " 以外的任何零个或多个字符,尽可能少,然后是可选的 / 和一个" 字符
    • | - 或
    • (\S+)(?<!\/) - 组 1(组 ID 仍然是 1,因为它在分支重置组中):一个或多个空格,末尾没有 /
  • .* - 该行的其余部分。