2017-08-11 91 views
0

私は次のコードを持っている:のPowerShell:認識できないエスケープシーケンス

$BuildDetails = Get-Content "d:\BuildDetails.txt" 

[regex]$BuildDetailsRY = '\bRY:\s+\K\S+' 
[regex]$BuildDetailsRoY = '\bRoY:\s+\K\S+' 
[regex]$BuildDetailsSP = '\bSP:\s+\K\S+' 
[regex]$BuildDetailsRC = '\bRC:\s+\K\S+' 
[regex]$BuildDetailsBranch = '\bBranch:\s+\K\S+' 

$ReleaseYear = $BuildDetails | Select-String $BuildDetailsRY -AllMatches | Foreach-Object {$_.Matches} | 
     Foreach-Object {$_.Groups[2].Value} 

Write-Host Release Year = $ReleaseYear 

を、私はそれを実行すると、私は次のエラーを取得する: は、値を変換できません "\ BSP:\ S + \ K \ S +" を入力するには、「システム.Text.RegularExpressions.Regex "である。エラー: "構文解析" \ bSP:\ s + \ K \ S + " - エスケープシーケンス\ Kが認識されません。

これは、テキストは、それが中に見ているファイルである。

RY: 17 
RoY: 2 
SP: 0 
RC: 1 
Branch: $/Release/17.2.x 

を私が行うには正規表現が例えばタイトルの後のデータを見つけることです欲しいです17

+0

はい、あなたの正規表現が無効であるとのエラーメッセージがそれを反映しています。 '\ k'は山括弧と名前を必要とし、その名前の前の捕捉グループは名前付きの逆参照です(https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular)。 -expression-language-quick-reference)か、大文字ではないかもしれません。何を聞いていますか?あなたの '\ K'は何を一致させることを意図していますか?リテラルのバックスラッシュ-kでは '\\ K'を意味しますか? – TessellatingHeckler

+0

@TessellatingHecklerテキストファイル内で何を検索しているかについて、さらに詳しく説明しました。私はテキストファイルで[リンク](https://regex101.com/)の正規表現をテストして、うまくいきます。 –

+0

Regex101.comは便利ですが、4つの正規表現エンジン(PCRE - Perl Compatible Regex Engine、GoLang、Python、JavaScript)のみを処理します。 .Netは独自のregexエンジンとはまったく異なっています。基本は素晴らしいですが、PCREと.Netでは\ kが異なります。 http://regexhero.net/tester/やhttp://regexstorm.net/testerのようなものができます.Net regexes online - しかし、PowerShellは.Net regexを実行するので、あなたには同じことを教えてくれます。 – TessellatingHeckler

答えて

0

は私が最終的により良い方法を発見した:

$BuildDetails = Get-Content "D:\BuildDetails.txt" 

[regex]$BuildDetailsRY = '(?<=RY:).*?(?=\s)' 
[regex]$BuildDetailsRoY = '(?<=RoY:).*?(?=\s)' 
[regex]$BuildDetailsSP = '(?<=SP:).*?(?=\s)' 
[regex]$BuildDetailsRC = '(?<=RC:).*?(?=\s)' 
[regex]$BuildDetailsBranch = '(?<=Branch:).*' 

$ReleaseYear = [regex]::matches($BuildDetails, $BuildDetailsRY) 
$ReleaseofYear = [regex]::matches($BuildDetails, $BuildDetailsRoY) 
$SP = [regex]::matches($BuildDetails, $BuildDetailsSP) 
$RC = [regex]::matches($BuildDetails, $BuildDetailsRC) 
$Branch = [regex]::matches($BuildDetails, $BuildDetailsBranch) 
関連する問題