PowerShell正则命名组如何捕获任意单词数量的姓名?
问题分析与解决方案
你的问题核心是原正则表达式中(?<Name>\w+\s\w+)仅能匹配两个空格分隔的单词,无法适配多词姓名。要实现通用匹配,关键是利用字符串的固定结构——姓名后必然紧跟, Age:分隔符,通过以下两种方式即可解决:
方案1:正向预查(推荐)
使用正向预查精准定位姓名的结束位置,确保匹配内容截止到, Age:之前,且不会包含该分隔符。修改后的正则如下:
$pop = New-Object -ComObject wscript.shell $string = "John Quincey Adams, Age: 204, Email: jqa@example.com" # 适配任意长度姓名的正则表达式 $regex = '(?<Name>.+?)(?=, Age:),\sAge:\s(?<Age>\d+),\sEmail:\s(?<Email>[^\s]+)' if ($string -match $regex) { $name = $matches['Name'] $age = $matches['Age'] $email = $matches['Email'] $pop.popup("Name: $name`nAge: $age`nEmail: $email",5,"Success",4096) } else { $pop.popup("No Matches found.",4,"Oh Oh",4096) } Exit
.+?:非贪婪匹配任意字符,避免过度匹配后续内容(?=, Age:):正向预查,确保匹配内容后紧跟, Age:标识
方案2:匹配第一个逗号前的内容
如果你的姓名场景中绝不会包含逗号,可以直接匹配所有非逗号字符,直到遇到第一个逗号:
$regex = '(?<Name>[^,]+),\sAge:\s(?<Age>\d+),\sEmail:\s(?<Email>[^\s]+)'
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

