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



给定一个命令行

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,其中一些可能(或可能不(用双引号括起来,和/或可能(或不(有前导/

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

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

附加这样的负面展望是不起作用的

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

有什么线索可以忽略正则表达式组中特定位置(如最右边(的提取字符吗?

您可以使用

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

请参阅regex演示详细信息

  • S*-零个或多个非空白字符
  • mycommand-文字字符串
  • s+-一个或多个空白
  • (?:-S+s+)*-零次或多次出现-、一个或多个非空白、一个或者多个空白
  • (?|"([^"]*?)/?"|(S+)(?<!/))-一个分支重置组,匹配以下任一项:
    • "([^"]*?)/?"-",组1捕获除"之外的任何零个或多个字符,尽可能少,然后是可选的/"字符
    • |-或
    • (S+)(?<!/)-组1(组ID仍然是1,因为它在分支重置组内(:一个或多个末尾没有/的空白
  • .*—线路的其余部分

最新更新