我从票证中收到以下形式的注释:
[Employee ID]:
[First Name]: Test
[Last Name]: User
[Middle Initial]:
[Email]:
[Phone]:
[* Last 4 of SSN]: 1234
我尝试使用以下代码来获取名字(在本例中为“Test”:
if ($incNotes -match '(^\[First Name\]:)(. * ?$)')
{
Write-Host $_.matches.groups[0].value
Write-Host $_.matches.groups[1].value
}
但我什么也没得到。有没有一种方法可以仅使用一个长正则表达式模式来获取我需要的信息?每张票上的信息都保持相同的格式。
我如何获取[名字]后面的信息:等等....
最佳答案
你可以使用
if ($incNotes -match '(?m)^\[First Name]: *(\S+)') {
Write-Host $matches[1]
}
请参阅regex demo 。如果 :
和名称之间可以有任何类型的水平空白字符,请将空格替换为 [\p{Zs}\t]
或某种 >[\s-[\r\n]]
。
详细信息:
(?m)
- 一个RegexOptions.Multiline
选项,使^
匹配任何行位置的开头,以及$
匹配行尾^
- 行的开头\[名字]:
-[名字]:
字符串*
- 零个或多个空格(\S+)
- 捕获组 1:一个或多个非空白字符(替换为\S.*
或\S[^\n\r]*
匹配任何文本直到字符串末尾)。
请注意,-match
是不区分大小写的正则表达式匹配运算符,如果需要区分大小写的行为,请使用 -cmatch
。此外,它仅查找第一个匹配项,并且 $matches[1]
返回第 1 组值。
关于regex - Powershell:无法让正则表达式在多行上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72049199/