首页 > 解决方案 > 使用 REGEX PowerShell 在 '_-_' 之前和之后获取单词

问题描述

我试图在一个看起来像' - '的非保证字符串之后获取单词之前和十进制字符串。

考虑这个字符串

"some str (targetWord - 12434 trailing string)" 

不保证此字符串在“-”之前或之后有空格,因此它可能类似于以下内容之一

"some str (targetWord-12434 trailing string)" 
"some str (targetWord- 12434 trailing string)" 
"some str (targetWord -12434 trailing string)"
"some str (targetWord-  12434 trailing string)"  

到目前为止,我有以下

$allServices = (Get-Service "Known Service Prefix*").DisplayName
foreach ($service in $allServices){
  $service = $service.split('\((.*?)\)')[1]  #esc( 'Match any non greedy' esc)
  if($service.split()[0] -Match '-'){
    $arr_services += $service.split('( - )')[0..1]
  }else{
    $arr_services += ($service -replace '-','').split()[0..1]
  }
}

这适用于处理'-'和'-'的简单情况,但不能处理其他任何事情。我觉得这是可以由一行或最多两行 REGEX 处理的问题。

我想要结束的是一个字符串数组,其中偶数(包括零)是 targetWord,奇数值是十进制字符串。

我的问题不是我不能做到这一点,而是它看起来像垃圾......我的意思是我的目标是尝试使用正则表达式来获取每个单词,忽略'-',然后推出一个不断增长的数组 targetWord 和 decimalString。

我认为这更像是一个难题,并试图用它来提高我的 REGEX 技能。任何帮助表示赞赏!

标签: regexpowershellparsing

解决方案


传递给操作员的单个正则表达式-match就足够了:

$arr_services = $allServices | ForEach-Object { 
  if ($_ -match '\((?<word>\w+) *- *(?<number>\d+)') { 
    # Output the word and number consecutively.
    $Matches.word, $Matches.number 
  }
}

# Output the resulting array.
$arr_services

请注意如何将管道输出作为数组 ( $arr_services = ...) 直接收集在变量中 - 无需迭代地“添加”到数组中。如果您需要确保它$arr_services始终一个数组 - 即使管道仅输出一个对象,请使用[array] $arr_services = ...

使用您的示例字符串,以上产生(一个连续的字数对的平面数组):

targetWord
12434
targetWord
12434
targetWord
12434
targetWord
12434

至于正则表达式:

  • \(匹配文字(

  • \w+匹配在命名捕获组( ) 中捕获+的单词字符 ( \w- 字母、数字、 ) 的非空运行 ( )。_word(?<word>...

  •  *- *匹配-由任意数量的空格包围的文字 - 包括无 ( *)。

  • \d+匹配\d在命名组中捕获的非空数字 ( )运行digits

如果-match操作员找到匹配项,结果将反映在自动$Matches变量中,这是一个允许直接按名称访问命名捕获组的哈希表。


推荐阅读