繁体   English   中英

正则表达式捕获组

[英]RegEx Capture Groups

我正在开发一个 PowerShell 工具来操作快捷方式,我很确定使用 RegEx 和捕获组会容易得多。 但我是捕获组的新手(几周前用一个相当简单的方法取得了第一次成功)。

所以,给定一个字符串,比如some text here -file "some path here" potentially some text here我想捕获三组。 第一个引号之前的所有内容、第一对引号的内容以及第二个引号之后的所有内容(也可能包含引号)。 认为向前看和向后看是我需要的,在“引号内”捕获组之前和之后获取所有内容。 但是,考虑到 RegEx 仍然让我头晕目眩,我正在寻找一些正确方法的验证。 或者我最好只捕获引用的位,然后对匹配的引用字符串进行 PowerShell 拆分以获取它之前和之后的内容?

编辑:

好的,我想我在这里学到了一些东西。 所以,我对这里提到的内容进行了修改,并进行了一些扩展。 因为我意识到 -file 参数只在路径中有空格时才需要引号,所以我真的需要检查未引用的条件。 当它不加引号时,它是 -file 之后的一个空格开始路径,但它可以以另一个空格或字符串的结尾结束。 所以,使用这个

'^(.*?)(-file ".*?"|-file .*? )(.*)$'

只要后面有参数,我就可以捕获任一条件,因此第二个空格用于分隔路径。 但是如果字符串是

some text here -file some_path_here

它失败了,因为我特别在寻找第二个空间。 所以我试过这个

'^(.*?)(-file ".*?"|-file .*? |-file .*?$)(.*)$'

令我震惊的是,它奏效了,即使提到了两次字符串的结尾。 我只是想知道,我是不是走进了一个我看不到的陷阱? 或者有没有更好的方法,即使这个方法没有带来危险?

这将起作用:

^(.*?)(".*?")(.*)$

在这里测试

如果您想从第二组中排除引号,只需将它们放在括号外,如下所示:

^(.*?)"(.*?)"(.*)$

尝试这个:

^(.*?)"(.*?)"(.*)

请参阅现场演示,显示根据相关示例捕获的组。

您可以使用该模式:

(^.*?)(?= "|(?<=-file)\s[a-z]) "?([^"\n]+)"?([a-z ]+$)?
  • (^.*?)捕获组。 断言^行的开头,懒惰地匹配任何内容。
  • (?= "|(?<=-file)\\s[az])空格和"正向前瞻,或任何以-file文本。 后跟空格和字母字符。
  • 匹配空格。
  • "匹配"可选。
  • ([^"\\n]+)"? 捕获组。 匹配除"或换行符\\n之外的任何内容。可选匹配"
  • ([az ]+$)? 可选的捕获组。 匹配小写字母或空格直到行$结束。

你可以在这里试试。


Powershell 中

  • 对于第一个字符串:

$matches = 'some text here -file "some path here" potentially some text here' | Select-String -Pattern '(^.*?)(?= "|(?<=-file)\\s[az]) "?([^"\\n]+ )"?([az ]+$)?'

然后执行:

$matches.Matches.Groups

查看所有组的内容。 然后,您可以使用索引访问捕获组的内容。 例如:

$matches.Matches.Groups[1]

印刷:

Success  : True
Name     : 1
Captures : {1}
Index    : 0
Length   : 20
Value    : some text here -file

  • 对于第二个字符串:

$matches = 'some text here -file some_path_here' | Select-String -Pattern '(^.*?)(?= "|(?<=-file)\\s[az]) "?([^"\\n]+)"?([az ]+$)?'

命令:

$matches.Matches.Groups[1]

印刷:

Success  : True
Name     : 1
Captures : {1}
Index    : 0
Length   : 20
Value    : some text here -file

您根本不需要使用前瞻。 您只需要以下内容:

^(.+)"(.+)"(.*)$

您可以在 regexr 上看到一个工作示例

第一组

(.+)

这将匹配 1 个或多个字符直到第二组。

第二组

"(.+)"

这将匹配一个引号,然后是一个或多个字符,然后是一个引号。

第三组

(.*)

这将匹配任意数量的字符,但它是可选的,因为*将匹配 0 个或多个字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM