我正在使用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 .*?$)(.*)$'
令我震惊的是,即使两次提到了字符串结尾。我只是想知道,我是不是走进陷阱却看不到这样做呢?还是有更好的方法,即使这个方法没有带来危险?
答案 0 :(得分:0)
答案 1 :(得分:0)
答案 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个或更多字符。