字符串的Powershell正则表达式选择部分

时间:2018-12-13 18:29:41

标签: regex powershell

我有一个变化的字符串

BLUE ORIGIN             CONTACT:  MB

第一部分是变化的,它基本上是一个客户名称。因此,字符和空格的数量将发生变化。

我知道我可以使用它,它会满足我的需求

$String = 'BLUE ORIGIN             CONTACT:  MB'
$string -match '(^\S+\s+\S+)(\s+)(CONTACT:)(\s+)(\S+)'
$Matches[1]

但是,如果字符串更改为类似的内容,且没有空格

CUSTOMERNAME            CONTACT:  MB

-match为假。

我该如何做一个正则表达式来捕获字符串的第一部分,而不管其长度或字符如何?

可能不是很清楚。我追求的价值观是

$Matches[1]-上面是蓝色起源

$Matches[3]-联系人:

$Matches[5]-MB

4 个答案:

答案 0 :(得分:3)

正则表达式引擎通常支持字符串的部分匹配。不要尝试匹配unsigned char

之前的所有内容
CONTACT:

输出:

$s = 'BLUE ORIGIN             CONTACT:  MB'
$s -match 'CONTACT:\s+(\S+)'
$Matches

(因此,您只需执行Name Value ---- ----- 1 MB 0 CONTACT: MB 就可以得到您想要的值。)

如果您需要将整行分解为多个数据元素,而不仅仅是这一个,我不认为我会使用正则表达式。我将研究开发解析器(语法分析器)。但是,在PowerShell中执行此操作可能不明智。 Here是一些.NET工具可能会对此提供帮助。

答案 1 :(得分:2)

您是IMO使事情变得过于复杂。
通过为捕获组放置括号,您可以确定要捕获的内容。

$String = 'BLUE ORIGIN             CONTACT:  MB'
$string -match '^(.*?)\s+(CONTACT:)\s+(\S+)' | Out-Null
$matches | ft -AutoSize

Name Value
---- -----
3    MB
2    CONTACT:
1    BLUE ORIGIN
0    BLUE ORIGIN             CONTACT:  MB

$string = "CUSTOMERNAME            CONTACT:  MB"
$string -match '^(.*?)\s*(CONTACT:)\s+(\S+)'|Out-Null
$matches | ft -AutoSize

Name Value
---- -----
3    MB
2    CONTACT:
1    CUSTOMERNAME
0    CUSTOMERNAME            CONTACT:  MB

答案 2 :(得分:1)

根据提供的数据,这将为您完成工作

[A-Za-z\s]+CONTACT:\s+\S+
  

说明

  • [A-Za-z\s]+-匹配任何字母或空格一次或多次。
  • CONTACT:-匹配CONTACT:
  • \s+-匹配一个或多个空格字符。
  • \S+-匹配一个或多个非空格字符。

Demo

答案 3 :(得分:1)

要使您的正则表达式适用于两个示例,可以将(^\S+\s+\S+)更改为(^\S+\s*\S+),使空白\s*字符匹配0次以上而不是1次以上。

(^\S+\s*\S+)(\s+)(CONTACT:)(\s+)(\S+)
.......^

Regex demo

如果您不再在工具或代码中引用捕获组,则可以忽略(\s+)周围的捕获组,而只需匹配\s+