powershell正则表达式无法隐藏值

时间:2015-01-13 15:55:37

标签: regex powershell

尝试在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的字符串值作为参数。

我们尝试了几种方法没有运气,你能帮忙解决这个问题吗?

1 个答案:

答案 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})+)"