none
最初のマッチ

    質問

  • お世話になります。

    「最初にマッチした数値は整数にする」で次の正規表現をで正しく求められたのですが、

    > "123.5487 458.0125 782.5554" -replace  '^(\d+)(\.\d\d[1-9]?)\d*','$1'
    > "123  458.0125 782.5554"

    次のようにスペースがある場合や、文字が挿入されている場合、2番目、3番目の数値も整数化されてしまいます。

    > " 123.5487 458.0125 782.5554" -replace  '(\d+)(\.\d\d[1-9]?)\d*','$1'
    >  " 123 458 782"

    perlでは、s/・・・・/・・・/g gオプションある時だけ、同じ行に複数マッチする場合には、全部置換されるのですが、
    powershellでは、それがデフォルトみたいなのです。回避する方法ってありますか。 

    もちろん次の方法では対応できそうですが。。。

    -replace "(^[\w\s]*\s?)(.\d+)",'$1'

    最初のマッチという概念ってあるのでしょうか?



    • 編集済み Brillia 2011年10月31日 9:43
    2011年10月31日 9:10

回答

  • PowerShellのというよりは.NETの正規表現にglobalフラグってなかったような気がします。

    最初のマッチを取ってくるのはMatchメソッドを使い、すべてのマッチを取ってくるのはMatchesメソッドを使うという感じですね。

    置換に関しても同様で、Replaceメソッドのオーバーロードに置換する数を指定するものがあります。

    よってPowerShellで最初のマッチのみ置換するには、RegExオブジェクトを作ってそのReplaceメソッドを使うしかないんじゃないかと思います。

    $r=[regex]'(\d+)(\.\d\d[1-9]?)\d*'
    $r.Replace(" 123.5487 458.0125 782.5554",'$1',1)
    


    • 回答としてマーク Brillia 2011年11月1日 0:40
    2011年10月31日 10:48

すべての返信

  • PowerShellのというよりは.NETの正規表現にglobalフラグってなかったような気がします。

    最初のマッチを取ってくるのはMatchメソッドを使い、すべてのマッチを取ってくるのはMatchesメソッドを使うという感じですね。

    置換に関しても同様で、Replaceメソッドのオーバーロードに置換する数を指定するものがあります。

    よってPowerShellで最初のマッチのみ置換するには、RegExオブジェクトを作ってそのReplaceメソッドを使うしかないんじゃないかと思います。

    $r=[regex]'(\d+)(\.\d\d[1-9]?)\d*'
    $r.Replace(" 123.5487 458.0125 782.5554",'$1',1)
    


    • 回答としてマーク Brillia 2011年11月1日 0:40
    2011年10月31日 10:48
  • ご返事ありがとうございます。

    RegExを確認してみようと思います。

    2011年11月1日 0:40
  • 解決済みですが、単に正規表現のパズルですよね。

    " 123.5487 458.0125 782.5554" -replace '^([^\d]+\d+)(?:\.\d*)?([^.\d].*)$','$1$2'

    手段はいろいろあるかと。

    2011年11月1日 1:13
  • おそらく、正規表現での解決ではなく、「最初のマッチ」という概念を、何らかのオプションで解決を望んでいたのでしょう。

    正規表現では解決できてそうだし・・・
    最初のマッチという概念は、powershellにはないので、RegExクラスを使用するべきかと。。。

    また、佐祐理さんの正規表現では、「数値以外の文字がない場合」が対応されていないのでは。

    スペースがある場合や、文字が挿入されている場合・・・

      と記述されているので、「ない場合」も考慮しなければならないので、次の正規表現のほうがいいのでは、

     

     -replace '^([^\d]*?\d+)(?:\.\d*)?([^.\d].*)$','$1$2'

     


    • 編集済み OTAKA 2011年11月1日 7:54
    2011年11月1日 7:50