如何提取变量中多次出现的动态子字符串

如何解决如何提取变量中多次出现的动态子字符串


学习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数组,当使用时,如何显示几个“名字”,因为我无法索引它,所以我也尝试了 [0]或 ...

我越努力,就会越困惑。
我也尝试将问题分解为较小的问题,以简化流程,但随后并不能反映真实的事物,有时会有不同的行为。
我的逻辑有什么问题?和搜索模式?
我是否应该重新考虑我对待这个问题的方式?我的意思是,如果我从另一个角度看问题,例如按人员和针对每个人员的话...则例如,在相同的人/姓名下,我陷入了太多结果,而在下一个人/人之间,结果却是相同。
抱歉,如果这有点长,但是如您所见,请将其分开并放宽全局。
先感谢您。欢迎发表任何评论。

解决方法

有关您正在使用的某些技术的一些基本信息:

  • 语法(?<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-> NameValue。因此,这意味着您将必须遍历Match对象,然后遍历Groups
  • $matches是一个自动变量。当对单个字符串使用-match运算符并找到成功的匹配项时,它将进行更新。然后,您可以检索$matches$matches.capturegroup等。如果找不到匹配项,它将保留其当前值,即当找不到匹配项时将不会更新!
  • .*是任何字符的贪婪匹配。 .*?是任何字符的惰性(不规则)匹配。总结差异,贪婪的匹配将继续尽可能长的匹配。延迟匹配将尽快停止匹配。
    • '11121112' -match '\d*2'将与11121112匹配,但'11121112' -match '\d*?2'将与1112匹配
  • -match在针对单个字符串使用时返回TrueFalse。当对集合使用时,它将返回匹配的项目。要抑制输出,请使用null$null = 'something' -match 'something''something' -match 'something' | Out-Null
  • 这样的[void]('something' -match 'something')机制>
  • (?s)是模式修改器。语法为(?modifierflag)s是单行。修饰符之后的所有匹配项都会应用修饰符。 s的优点是.字符将与换行符(回车符和换行符)匹配。因此,如果您有一个包含换行符的字符串作为换行符,则可能需要跨行进行匹配。

要使这些示例中的任何一个都能正常工作,请假设$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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-