最近、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>.*?)::"