2015-01-15 57 views
1

我有一個正則表達式,當我使用各種在線正則表達式測試網站時,返回正確的結果。但是,當我在PowerShell腳本中使用正則表達式時,它只返回一行而不是多行。我希望PowerShell的專家能告訴我我做錯了什麼。我正在使用PowerShell v1。Powershell正則表達式拒絕在多行上運行

這是我的正則表達式: https://regex101.com/r/eA5jB2/3

這是我的PowerShell腳本: -

#Read the file 
$FilePath = "testfile.txt" 

$regex = '(?msi)^0[12][VM](?:[^\n]|\n(?!0[12][VM]|50|90))+' 
get-content $FilePath | select-string -pattern $regex 

回報是單行

01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 01 01 01 

,而不是

01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 01 01 01 
01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx 

回答

0

我認爲問題是使用Select-String。

$text = 
@' 
00 date 
01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx 
01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01=9xxxxxxxxxxxxxxxxxxxxxxxxxxx 
50 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxx 
01Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$A xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$B 0xxxxxxxxxxxxxxxxxxxx 
01$0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$5xxxxxxxxxxxxxxxxxxxxxxxxxxx 
50 xxxxxxxxxxxx BatchTotal 
90 xxxxxxxxxxxx FILETotal 
'@ 

$regex = '(?msi)^0[12][VM](?:[^\n]|\n(?!0[12][VM]|50|90))+' 


[regex]::matches($text,$regex) | 
foreach {$_.groups[0].value;'***'} 

01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx 
*** 
01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01=9xxxxxxxxxxxxxxxxxxxxxxxxxxx 
*** 
01Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$A xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$B 0xxxxxxxxxxxxxxxxxxxx 
01$0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
01$5xxxxxxxxxxxxxxxxxxxxxxxxxxx 
*** 
+0

這工作正常!當我使用「$ text = get-content $ FileName | out-string」來讀取我的文件時,它就起作用了。問題解決了。 – user3046742

1

問題出在Get-Content cmdlet上,因爲它返回一行數組,所以無法匹配文本除換行符。

嘗試用其他方法來獲得文件內容:

[IO.File]::ReadAllText($FilePath) 
Get-Content $FilePath -Raw 
Get-Content $FilePath | Out-String 

你可以找到一個類似的問題here

+0

謝謝,但是當我嘗試第一個和最後一個方法時,我的腳本返回了每一個可能的行,第二個不被powershell v1支持。當我做了「get-content $ filepath | out-string> temp.txt」並將文件複製到在線正則表達式測試網站時,所有方法都正常工作。 – user3046742

+0

@ user3046742這些方法僅用於讀取文件,以便可以應用正則表達式。您仍然需要將其管入「選擇字符串」中。 –