尝试在Windows 7上的powershell和regex的帮助下实现以下要求,我们从命令提示符获取进程状态输出,如下所示,我们需要使用正则表达式将这些转换为以下格式
PROCNAME PRODPROC Last Started 2012-05-23 11:45 Status RUNNING
lst Lag 00:00:00 (updated 00:00:00 ago)
尝试以下正则表达式获取:
PROCNAME PRODPROC Status RUNNING lst Lag 00:00:00 an updated 00:00:00
$regex=[regex] "PROCENAME\s*(?[a-zA-Z_0-9]+).+?Status\s(?[a-zA-Z]+).+?lst Lag(\s|\t)+(?((\d)+:\d{2}:\d{2})+).+?updated\s+(?((\d)+:\d{2}:\d{2})+)"
当我们尝试执行此操作时,请收到以下错误消息
Cannot convert value “PROCENAME\s*(?[a-zA-Z_0-9]+).+?Status\s(?[a-zA-Z]+).+?lst
Lag(\s|\t)+(?((\d)+:\d{2}:\d{2})+).+?updated\s+(?((\d)+:\d{2}:\d{2})+)”
to type “System.Text.RegularExpressions.Regex”. Error: “parsing “PROCNAME\s*(?[
a-zA-Z_0-9]+).+?Status\s(?[a-zA-Z]+).+?lst Lag(\s|\t)+(?((\d)+:\d{2}:\d{
2})+).+?updated\s+(?((\d)+:\d{2}:\d{2})+)” – Unrecognized grouping construct.”
But if we removed the ? ((?[a-zA-Z_0-9]+), (?[a-zA-Z]+) and ) , (\s|\t)+(?((\d)+:\d{2}:\d{2})+) and (?((\d)+:\d{2}:\d{2})+)
从括号内部显示结果但我们无法匹配,但我们需要$regex.GetGroupNames
的字符串值作为参数。
我们尝试了几种方法没有运气,你能帮忙解决这个问题吗?
答案 0 :(得分:0)
您有许多以(?...)
为目标的群组抱怨:Unrecognized grouping construct
。省略它们或添加:
以使它们成为非捕获组:
$regex=[regex]"PROCNAME\s*(?:[a-zA-Z_0-9]+).+?Status\s(?:[a-zA-Z]+).+?lst Lag(\s|\t)+(?:((\d)+:\d{2}:\d{2})+).+?updated\s+(?:((\d)+:\d{2}:\d{2})+)"
或使用(?<groupName>.*)
指定群组名称:
$regex=[regex]"PROCNAME\s*(?<name>[a-zA-Z_0-9]+).+?Status\s(?<status>[a-zA-Z]+).+?lst Lag(\s|\t)+(?<started>((\d)+:\d{2}:\d{2})+).+?updated\s+(?<updated>((\d)+:\d{2}:\d{2})+)"