2014-12-10 3 views
2

Я пытаюсь найти все копии текста, которые выглядят следующим образом:Powershell регулярного выражения с исключенным рисунком (Guid)

log.Error("{something other than guid formatted string}")

например, это было бы Postive матч:

log.Errog("some message")

и это не будет соответствовать

log.Error("4e6c1b55-67a7-448d-a5fe-8c9fb8a31371")

У меня есть следующий, который работает напротив как я намереваюсь, который должен сказать, что успешно находит экземпляры с GUID:

$positiveMatch = "log.Error(`"some message`")" 
$negativeMatch = "log.Error(`"4e6c1b55-67a7-448d-a5fe-8c9fb8a31371`"" 
$pattern = "log\.Error\(`"[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}`"" 

[regex]::matches($positiveMatch, $pattern) 
[regex]::matches($negativeMatch, $pattern) 

Моя попытка обратных это не удается для обеих строк:

$pattern = "log\.Error\(`"?![a-fA-F0-9]{8}?!-?!([a-fA-F0-9]{4}-){3}?![a-fA-F0-9]{12}`"" 

Как я могу получить список всех log.Error(", которые не содержат указатель?

ответ

1

Используйте отрицательное опережения утверждение, как показано ниже,

log\.Error\("(?![a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}")[^"]*"\) 

DEMO

И не забудьте, чтобы избежать двойные кавычки, если это необходимо.

Чтобы получить эту работу в PowerShell, а также для обеспечения дополнительного контента в конце линии (например, log.Error("some message", "additional params"), картина будет выглядеть следующим образом:

$pattern = "log\.Error\(`"(?![a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}`")" 
+0

это сделал трюк, спасибо для тех, кто еще читает это, собственно побег для PowerShell, необходимо использовать обратный апостроф, чтобы избежать внутренних двойные кавычки – Matt

+0

Благодарим за помощь! – Matt

1

Поскольку вопрос был помечен : в PowerShell вас «d использовать Select-String с -NotMatch параметра:.

PS C:\>$pattern = 'log\.error\("[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}"\)' 
PS C:\>@' 
>>log.Error("some message") 
>>other text 
>>log.Error("4e6c1b55-67a7-448d-a5fe-8c9fb8a31371") 
>>log.Error("{something other than guid formatted string}") 
>>4e6c1b55-67a7-448d-a5fe-8c9fb8a31371 
>>'@ -split "`n" | Select-String $pattern -NotMatch | select -Expand Line 
>> 
log.Error("some message") 
other text 
log.Error("{something other than guid formatted string}") 
4e6c1b55-67a7-448d-a5fe-8c9fb8a31371
Смежные вопросы