トップ回答者
最初のマッチ

質問
-
お世話になります。
「最初にマッチした数値は整数にする」で次の正規表現をで正しく求められたのですが、
> "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
回答
-
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
すべての返信
-
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
-
おそらく、正規表現での解決ではなく、「最初のマッチ」という概念を、何らかのオプションで解決を望んでいたのでしょう。
正規表現では解決できてそうだし・・・
最初のマッチという概念は、powershellにはないので、RegExクラスを使用するべきかと。。。また、佐祐理さんの正規表現では、「数値以外の文字がない場合」が対応されていないのでは。
スペースがある場合や、文字が挿入されている場合・・・
と記述されているので、「ない場合」も考慮しなければならないので、次の正規表現のほうがいいのでは、
-replace '^([^\d]*?\d+)(?:\.\d*)?([^.\d].*)$','$1$2'
- 編集済み OTAKA 2011年11月1日 7:54