1

だから私がする必要があるのは、特定の文字に到達するまでテキストを一致させ、その後停止することです。今、私はそれを正しく機能させるのにかなりの時間を費やしています.この時点で、私は自分自身をさらに混乱させていると思います. 検索するテキストは次のようになります。

ServerA_logfile.log
ServerB_logfile.log
ServerC_logfile.log

私がする必要があるのは、サーバー名を返し、アンダースコア文字の後のすべてを除外することです。

これが私のコードです:

Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { [regex]::match($_ -replace "^_", "")}

それが返すものは....まあ、役に立ちませんが、それは私が得ることができるのと同じくらい良いです.

私は何が欠けていますか?

4

3 に答える 3

6

必要なのは前向きな先読みです(何かが起こるの試合に合わせて調整されています)

[Regex]::Match($_, "^.+(?=_)").Value

Match()文字列ではなく、Matchオブジェクトを返します。したがって、Valueオブジェクトから文字列を抽出するには、プロパティにアクセスする必要があります。

明確でない場合、使用される式は以下を検索するように指定します。

  • 行頭(^
  • 任意の長さの文字列(1文字以上)(.+
  • アンダースコア()が続く(?=_)、それは前向きな先読みです
于 2012-09-13T16:21:21.877 に答える
3

別の非常に簡単な解決策があります:

[Regex]::Match($_, "^[^_]*").Value

[^_]アンダースコア以外のすべての文字に一致します。したがって^[^_]*、文字列の先頭から一致を開始し、最初のアンダースコアの前で停止します。

于 2012-09-13T17:07:21.887 に答える
2

正規表現が要求されたことは知っていますが、組み込みsplitコマンドを使用するのと同じくらい簡単です (おそらく簡単です)。

コードは次のとおりです。

Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { $_.Split("_")[0] }
于 2012-09-13T17:02:13.443 に答える