none
ファイル名を指定の箇所で2つに分けたい RRS feed

  • 質問

  • Power Shellで以下のようなファイル名をアルファベット部分と数字部分で二分し、
    アルファベット部分のみを取得したいと考えています。

    ・サンプルファイル名
    AA_B_C_20191018_001 ⇒ AA_B_C
    DD_E_20191018_001  ⇒ DD_E

    区切り記号までの指定の文字数が決まっていないため、
    型で見分ける方法を使用するイメージでいますが、
    何科良い方法がありましたら、教えていただきたいです。

    よろしくお願いいたします。

    2019年10月18日 7:41

回答

  • 正規表現とMatchesを使うとできます。

    $sample = @("AA_B_C_20191018_001","DD_E_20191018_001")
    
    # 数値以外:([^0-9]+)
    # 数値のみ:(\d+)
    $sample | ?{$_ -match "^([^0-9]+)(\d+)"} | %{"数値以外($($matches[1]))  数値($($matches[2]))"}


    ■ 結果

    数値以外(AA_B_C_)  数値(20191018)
    数値以外(DD_E_)  数値(20191018)

    最後のアンダーバーが不要であれば

    $sample | ?{$_ -match "^([^0-9]+)_(\d+)"} | %{"数値以外($($matches[1]))  数値($($matches[2]))"}

    とします。

    • 編集済み やき(Yaki) 2019年10月21日 2:37 結果追加
    • 回答としてマーク Lopez0312 2019年10月23日 5:10
    2019年10月21日 2:35

すべての返信

  • 正規表現を使って、-replace演算子により置換をかけるというのではどうでしょうか。

    $fileName = "AA_B_C_20191018_001"
    $fileName -replace '_\d{8}_\d{3}$'

    正規表現での\d{8}は、数字が8文字連続している、ということを表します。$は文字列の末端を意味します。つまり、区切り文字(ここでは「_」)の後の数字部分を消す、という意味になります。

    2019年10月18日 9:54
    モデレータ
  • 正規表現とMatchesを使うとできます。

    $sample = @("AA_B_C_20191018_001","DD_E_20191018_001")
    
    # 数値以外:([^0-9]+)
    # 数値のみ:(\d+)
    $sample | ?{$_ -match "^([^0-9]+)(\d+)"} | %{"数値以外($($matches[1]))  数値($($matches[2]))"}


    ■ 結果

    数値以外(AA_B_C_)  数値(20191018)
    数値以外(DD_E_)  数値(20191018)

    最後のアンダーバーが不要であれば

    $sample | ?{$_ -match "^([^0-9]+)_(\d+)"} | %{"数値以外($($matches[1]))  数値($($matches[2]))"}

    とします。

    • 編集済み やき(Yaki) 2019年10月21日 2:37 結果追加
    • 回答としてマーク Lopez0312 2019年10月23日 5:10
    2019年10月21日 2:35