2014-10-20 5 views
1

У меня есть следующий PowerShell сценарий:PowerShell не регулярное выражение работает

$SCRIPTNAME = "myfile.js" 
$SUBJECT = Get-Content $SCRIPTNAME | Out-String 
if ($SUBJECT -match ".*/// COMMENT.*?$(.*)") 
{ 
    echo $matches[1]; 
} 
$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); 

Это порождает следующую ошибку (я пытаюсь использовать регулярное выражение группы захвата, но не работает):

.* : The term '.*' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the 
spelling of the name, or if a path was included, verify that the path is correct and try again. 
At C:\Users\User\Desktop\install.ps1:21 char:39 
+ if ($SUBJECT -match ".*/// COMMENT.*?$(.*)") 
+          ~~ 
    + CategoryInfo   : ObjectNotFound: (.*:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

Почему у него проблемы с частью .* второй группы захвата?

+2

У вас есть конец строки якоря '$' перед ним, которые могут быть причиной проблем. Либо выйдите из него, если хотите буквальный '$' или переместите его в конец шаблона. – arco444

+0

@ arco444 Я попытался поставить '\ $' вместо этого, но это все равно вызывает ту же ошибку. – Alexandru

+0

@ arco444 Собственно, я избежал внутренних скобок с '\ (' и '\)' ... и я думаю, что это действительно могло сработать и/или было проблемой. – Alexandru

ответ

2

Got it. Мне нужно, чтобы избежать регулярных выражений в одинарные кавычки '', и, кроме того, добавить одну и многострочные спецификаторов (?sm):

$SCRIPTNAME = "myfile.js" 
$SUBJECT = Get-Content $SCRIPTNAME | Out-String 
if ($SUBJECT -match '(?sm).*/// COMMENT.*?$(.*)' -and $matches.Count -ge 2) 
{ 
    echo $matches[1]; 
} 
$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); 
+1

Glad Я смог помочь – Matt

+0

@Matt Ты спасатель :) – Alexandru

+0

Одиночные кавычки сделали это для меня, спасибо. –

Смежные вопросы