正则表达式捕获组

时间:2018-08-15 16:17:16

标签: regex powershell

我正在使用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 .*?$)(.*)$'

令我震惊的是,即使两次提到了字符串结尾。我只是想知道,我是不是走进陷阱却看不到这样做呢?还是有更好的方法,即使这个方法没有带来危险?

4 个答案:

答案 0 :(得分:0)

这将起作用:

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

Tested here

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

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

答案 1 :(得分:0)

尝试一下:

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

请参阅live demo,其中显示了根据相关示例捕获的组。

答案 2 :(得分:0)

您可以使用以下模式:

(^.*?)(?= "|(?<=-file)\s[a-z]) "?([^"\n]+)"?([a-z ]+$)?
  • (^.*?)捕获组。声明行^的开头,延迟匹配所有内容。
  • (?= "|(?<=-file)\s[a-z])对空格和"或在-file之前的文本之前的正向查找。其次是空格和字母字符。
  • 匹配空格。
  • "可选地匹配"
  • ([^"\n]+)"?捕获组。匹配"或换行符\n以外的任何其他字符。可选地匹配"
  • ([a-z ]+$)?可选捕获组。匹配小写字母或空格,直到行$的结尾。

您可以here试试。


Powershell 中:

  • 对于第一个字符串:

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

然后执行:

$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[a-z]) "?([^"\n]+)"?([a-z ]+$)?'

命令:

$matches.Matches.Groups[1]

打印:

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

答案 3 :(得分:0)

您根本不需要使用先行提示。您只需要以下内容:

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

您会看到一个working example on regexr

第一组

(.+)

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

第二组

"(.+)"

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

第三组

(.*)

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