如何解决如何提取变量中多次出现的动态子字符串
学习Powershell面临挑战:
我正在使用Powershell-ISE(在Windows服务器上)做GUI,以避免一直在键入命令。目的是显示一些信息,这些信息基于我从UNIX服务器收到的加密文件。
到目前为止,我能够在一个巨大的标签框中显示这些文件的内容,但是我很难解析它。
稍后,我需要将输出格式化为更易读的表,而不是一行,但是由于我已经在努力进行解析,因此将其保留在另一篇文章中。
我想这与我读过的其他有关“简单”字符串提取或-match和$ matches的官方文档的文章略有不同。而且,如果我使用正则表达式模式,那么我总是以整行结束或一无所有(模式很难定义,因为目标前后都有很多单词)。
同样,当我使用帖子中的类似代码时,在纯字符串上总是比较容易,但是在这里,我的变量包含输入($ Myinput),可能在我试图捕获的某些值的末尾带有\ n等隐藏字符(文件来自UNIX,在那里, cat命令用换行符正确显示它。.[并且不,我不能在Unix服务器上执行此脚本,我被Windows Server与基本的Powershell组件卡住了])。
总而言之,我陷入了一些过于简单的帖子和其他过于高级的帖子之间,以至于我无法理解。
如果您能帮助我解除逻辑限制,我将不胜感激,我将在此重新发布进度。
A.变量包含如下内容:
此文件包含2位用户的名字:Group1创建日期:2010年7月23日单词:单词单词单词:单词单词自:2004年1月Thu 01 01:00:00 CET 2004直到:1月01日1:00:59: 59 CET 2011单词单词单词*******************************************名称:word.word创建日期:2020年7月23日单词名称:单词单词单词单词:单词单词单词源于:2010年11月2日星期五欧洲中部时间:2011年1月1日星期三00:59:59欧洲中部时间** **********************************************名字:word.word创建日期: 2020年6月30日单词:单词单词单词单词名称:单词单词单词来源:2010年6月30日星期二11:14:33 CEST直到:9月28日星期一9:14:33 CEST 2021 ********** **************************************
注意:它就像一棵树,上面有一群,下面是人。一组或一个人是一个条目。
注意:我需要为每个条目捕捉名字和日期。
B.我尝试过的方法(不是所有尝试都在这里,太长了):
我只捕获人数和名字,最后我还需要“ from”和“ until”。
目前,我将它们全部按类型保留在数组中,但我想最好由“ people”(?)使用数组
#I take the number of people
$people = ([regex]::matches($Myinput,"\d+") | %{$_.value})
$labelOutputBox.AppendText("Number of entries: " + $people[0])
#result not optimized as I get all the digits from that input,and display only the first occurence
#method1 for names
([regex]::matches($Myinput,"First name:\s(?<FirstNames>.*)\sCreation date") | %{$_.value})
$labelOutputBox.AppendText("1/ FirstNames: ")
$labelOutputBox.AppendText($matches['FirstNames'])
# result empty
#method2 for names
$SearchStart="First name: "
$SearchEnd="Creation"
$Myinput -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
$result=$matches['content']
$labelOutputBox.AppendText("2/ FirstNames: ")
$labelOutputBox.AppendText($result)
#result empty,this is where I think a hidden character before the $SearchEnd
注意:我也不理解$ matches数组,当使用
我越努力,就会越困惑。
我也尝试将问题分解为较小的问题,以简化流程,但随后并不能反映真实的事物,有时会有不同的行为。
我的逻辑有什么问题?和搜索模式?
我是否应该重新考虑我对待这个问题的方式?我的意思是,如果我从另一个角度看问题,例如按人员和针对每个人员的话...则例如,在相同的人/姓名下,我陷入了太多结果,而在下一个人/人之间,结果却是相同。
抱歉,如果这有点长,但是如您所见,请将其分开并放宽全局。
先感谢您。欢迎发表任何评论。
解决方法
有关您正在使用的某些技术的一些基本信息:
- 语法
(?<Name>something)
用于创建命名的捕获组。此处捕获组名称为Name
,并将其应用于匹配项something
。- 要访问每个捕获组匹配项,可以使用以下语法:
-
[regex]::Matches('something','(?<MyName>something)').Groups | Where Name -eq 'MyName' | Foreach-Object { $_.Value }
-
- 要访问每个捕获组匹配项,可以使用以下语法:
- 使用
[regex]::Matches()
时,如果找到匹配项,将返回Match
对象的集合。可以使用以0开头的索引访问每个对象,例如[regex]::Matches()[0]
代表第一个对象,[regex]::Matches()[3]
代表第四个对象。 -
[regex]::Match()
返回一个Match
对象的集合。考虑到所有捕获组,它只会返回找到的第一个匹配项。因此,如果您有2个捕获组,它将返回捕获组0、1和2(0是整个匹配项)。- 例如
[regex]::Match('111112111121112','1(2)')
,一次产生一个12
对象时,仅匹配2
(捕获组0)和Match
(捕获组1)。[regex]::Matches
将返回3个Match
对象。
- 例如
- 属性的层次结构是
Match
对象->Groups
->Name
,Value
。因此,这意味着您将必须遍历Match
对象,然后遍历Groups
。 -
$matches
是一个自动变量。当对单个字符串使用-match
运算符并找到成功的匹配项时,它将进行更新。然后,您可以检索$matches
,$matches.capturegroup
等。如果找不到匹配项,它将保留其当前值,即当找不到匹配项时将不会更新! -
.*
是任何字符的贪婪匹配。.*?
是任何字符的惰性(不规则)匹配。总结差异,贪婪的匹配将继续尽可能长的匹配。延迟匹配将尽快停止匹配。-
'11121112' -match '\d*2'
将与11121112
匹配,但'11121112' -match '\d*?2'
将与1112
匹配
-
-
-match
在针对单个字符串使用时返回True
或False
。当对集合使用时,它将返回匹配的项目。要抑制输出,请使用null
,$null = 'something' -match 'something'
或'something' -match 'something' | Out-Null
这样的 -
(?s)
是模式修改器。语法为(?modifierflag)
。s
是单行。修饰符之后的所有匹配项都会应用修饰符。s
的优点是.
字符将与换行符(回车符和换行符)匹配。因此,如果您有一个包含换行符的字符串作为换行符,则可能需要跨行进行匹配。
[void]('something' -match 'something')
机制>
要使这些示例中的任何一个都能正常工作,请假设$MyInput
是一个字符串。
使用[regex]::Matches()
:
[regex]::matches($Myinput,'First name:\s(?<FirstNames>.*?)\sCreation date') | Foreach-Object {
($_.Groups | Where Name -eq 'FirstNames').Value # Your capture group values
}
使用$matches
:
$null = $Myinput -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
# If the above found a match,then the following will contain the content capture group
$matches.content
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。