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

Regex Powershell正则表达式选择字符串的一部分,regex,powershell,Regex,Powershell,我有一根不同的弦 BLUE ORIGIN CONTACT: MB 第一部分是变化的,它基本上是一个客户名称。因此,字符和空格的数量将发生变化 我知道我可以用这个,它会符合我的需要 $String = 'BLUE ORIGIN CONTACT: MB' $string -match '(^\S+\s+\S+)(\s+)(CONTACT:)(\s+)(\S+)' $Matches[1] 但是如果字符串变成这样,没有空格 CUSTOMERNAME

我有一根不同的弦

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

我知道我可以用这个,它会符合我的需要

$String = 'BLUE ORIGIN             CONTACT:  MB'
$string -match '(^\S+\s+\S+)(\s+)(CONTACT:)(\s+)(\S+)'
$Matches[1]
但是如果字符串变成这样,没有空格

CUSTOMERNAME            CONTACT:  MB
这场比赛是假的

我如何做一个正则表达式,无论字符串的长度或字符是多少,都能抓取字符串的第一部分

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

$Matches[1]-在上面的示例中为蓝色原点

$Matches[3]-联系人:


$Matches[5]-MB

正则表达式引擎通常支持字符串的部分匹配。在联系之前,不要尝试匹配所有内容:

输出:

Name                           Value
----                           -----
1                              MB
0                              CONTACT:  MB
因此,您只需执行$Matches[1]即可获得所需的值

如果需要将整行数据分解为几个数据元素,而不仅仅是这个元素,我不认为我会使用正则表达式。我将研究开发一个语法分析器。不过,在PowerShell中这样做可能是不明智的。有一些.NET工具可能对此有所帮助。

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

解释

[A-Za-z\s]+-一次或多次匹配任何字母表或空格。 联系人:-匹配联系人:。 \s+-匹配一个或多个空格字符。 \S+-匹配一个或多个非空格字符。
要使正则表达式适用于这两个示例,可以将^\S+\S+\S+更改为^\S+\S*\S+,使空格\S*字符匹配0+次而不是1+次

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

如果您不再在工具或代码中引用捕获组,\s+,您可以省略它,只需匹配它即可。

您的操作过于复杂。 通过为捕获组放置括号,您可以决定捕获什么

$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

使用[A-Za-z\s]+联系人:\s+\s+原点和联系人之间是否有制表符?联系人之前的数据是否保证为固定长度?如果是这样,你知道长度是多少吗?完全同意只匹配你想要捕获的字符串。这似乎最能代表OP的要求。
(^\S+\s*\S+)(\s+)(CONTACT:)(\s+)(\S+)
.......^
$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