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

