[英]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.