2017-02-02 3 views
0

Дано:Невозможно сопоставить многострочный регулярное выражение с Powershell (но он работает в C#)

PS D:\tmp> cat .\1.txt 
<abc xyz="1" 
    def="xx"> 
    xaxa 
</abc> 
<abc xyz="a"> 
PS D:\tmp> 

То, что я пытался:

PS D:\tmp> cat .\1.txt | sls '(?m:)<abc[^>]+>' 

<abc xyz="a"> 


PS D:\tmp> cat .\1.txt | sls '(?m:)<abc(?:[^>]|$)+>' 

<abc xyz="a"> 


PS D:\tmp> cat .\1.txt | sls '(?m:)<abc(?:[^>]|\$)+>' 

<abc xyz="a"> 


PS D:\tmp> 

Теперь я знаю, что все три варианта работы, как ожидается, в простой C#. Например:

PS D:\tmp> [Text.RegularExpressions.Regex]::Matches($(cat 1.txt), '(?m:)<abc[^>]+>') 


Groups : {<abc xyz="1"  def="xx">} 
Success : True 
Captures : {<abc xyz="1"  def="xx">} 
Index : 0 
Length : 27 
Value : <abc xyz="1"  def="xx"> 

Groups : {<abc xyz="a">} 
Success : True 
Captures : {<abc xyz="a">} 
Index : 42 
Length : 13 
Value : <abc xyz="a"> 



PS D:\tmp> 

Итак, мне интересно - то, что я делаю неправильно в чистом Powershell, что он не работает?

ответ

0

Две вещи:

Вы сейчас обжигающе массив строк в Select-String, и он будет обрабатывать их один за другим. Измените это, используя Get-Content -Raw.

Во-вторых, необходимо указать переключатель -AllMatches с Select-String, чтобы получить оба экземпляра:

PS C:\> Get-Content .\1.txt -Raw |Select-String '(?m:)<abc[^>]+>' -AllMatches |Select -Expand Matches 

Groups : {<abc xyz="1" 
       def="xx">} 
Success : True 
Captures : {<abc xyz="1" 
       def="xx">} 
Index : 0 
Length : 27 
Value : <abc xyz="1" 
       def="xx"> 

Groups : {<abc xyz="a">} 
Success : True 
Captures : {<abc xyz="a">} 
Index : 42 
Length : 13 
Value : <abc xyz="a"> 
Смежные вопросы