我有一个变化的字符串
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
答案 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+
-匹配一个或多个非空格字符。答案 3 :(得分:1)
要使您的正则表达式适用于两个示例,可以将(^\S+\s+\S+)
更改为(^\S+\s*\S+)
,使空白\s*
字符匹配0次以上而不是1次以上。
(^\S+\s*\S+)(\s+)(CONTACT:)(\s+)(\S+)
.......^
如果您不再在工具或代码中引用捕获组,则可以忽略(\s+)
周围的捕获组,而只需匹配\s+
。