2

最近、Powershell で正規表現を使い始めたところ、Select-String コマンドレットから予期しない応答が返されました。

次のようなものを入力すると、次のようになります。

$thing = "135" | Select-String -Pattern "(.*?)5"
$thing.Matches

Match-Info オブジェクトから期待される結果を受け取ります。

Groups   : {135, 13}
Success  : True
Captures : {135}
Index    : 0
Length   : 3
Value    : 135

ただし、キャプチャ グループを -Pattern の最後に配置すると、次のようになります。

$thing = "135" | Select-String -Pattern "(.*?)"
$thing.Matches

1 つが作成されますが、Match-Info は何も見つけられないようです。

Groups   : {, }
Success  : True
Captures : {}
Index    : 0
Length   : 0
Value    : 

私が言ったように、私は Powershell にまったく慣れていないので、この動作はオペレーターのエラーだと思います。

しかし、回避策は何ですか?この動作はまだ問題を引き起こしていませんが、私が扱っているファイル (XML ファイルに含まれる電子マニュアル) を考慮すると、最終的には問題になると思います。

...

よろしく、

シュベルト

...

説明:

動作を説明するために例を非常に単純にしましたが、最初の問題は次のパターンにありました。

$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)"

このファイルはマニュアル間のリンクのインデックスの 1 つであり、リンクの名前はファイルの各行にあるコメント ブロック内に含まれています。

名前とコメントが行末まで表示されていないため、このパターンは実際にはタイプミスです。プログラムが Match-Info オブジェクトで「linkname」を見つけられなかったときにエラーを出し始めたときに、私はそれを見つけました。

リンク名の後に出現する文字 ( ::) を指定すると、正しく機能しました。それを例に入れる:

$linkname = $line | Select-String -Pattern "`"na`"><!--(?<linkname>.*?)::"
4

1 に答える 1

3

私は正規表現の専門家ではありませんが、あなたのパターン"(.*?)"が問題だと思います。たとえば、? を削除すると、期待どおりにグループが取得されます。

また、XML の解析に正規表現を使用しないでください。:) 次のような、はるかに簡単な方法があります。

[xml]$Manual = Get-Content -Path C:\manual.xml

また

$xdoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path C:\manual.xml
$xdoc.Load($file)

構造化された形式で取得したら、ドット表記または XPath を使用してノードと属性をナビゲートできます。

于 2015-09-30T19:47:16.137 に答える