如何避免提取属于正则表达式组的最后一个特定字符?
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
,因为它在分支重置组中):一个或多个空格,末尾没有 /
.*
- 该行的其余部分。
给定一个命令行
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
,因为它在分支重置组中):一个或多个空格,末尾没有/
.*
- 该行的其余部分。