Rubyにおける正規表現による文字列のマッチングと置換操作の詳細

2953 ワード

正規一致
Rubyといえば、もちろんその正規表現メカニズムを提唱しなければならない.正規表現は強力なマッチング言語として、文字列検証、マッチング、ウェブページ抽出など、さまざまな分野で使用されている.正規表現とのマッチング効率を非難する人もいるが、正規表現の強力なマッチング能力を考えるとどうでもいい.
ルビーの正規表現といえばルビーの=~とmatchの2つのマッチング方式を言わないわけにはいかないので、この2つのマッチング方式の違いを実例で説明しましょう.まず、=~の使い方を話しましょう.

message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
puts regex=~message 
message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
puts regex=~message 

Rubyでは正規表現一致文を//で表しています.実行してみてください.上の文は、3つの数字の両方が小文字の文字列に一致しています.上記のコードを実行すると、結果10が表示されます.なぜ10という結果が出たのか不思議に思うでしょうが、これが=~の魅力で、彼はマッチング結果の最初の出現位置を印刷しています.
では、matchを見てみましょう.

message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
puts regex.match(message) 
 
message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
 
puts regex.match(message) 

出力結果を見てみましょう:f 414 j.この文字列は、正規文が一致するルールに合致するすべての結果セットを表します.みんなが気づいたかどうか分かりませんが、私たちは正規表現の中で括弧を使っています.私たちは3つの数字を抽出すればいいと思っています.もちろんこれも簡単です.上のコードで少し修正するだけです.

message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
regex.match(message) 
puts $1 
 
message="afhadhffkdf414j" 
regex=/[a-z](\d{3})[a-z]/ 
regex.match(message) 
puts $1 

結果は当然414である.なぜ$0ではなく$1を使うのか、$0の結果を見てみましょう.

C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb

出力されたオブジェクト情報です.
次に、文字列の中にルールに合った情報がたくさんあるとしたらどうしますか.上の文は最初に見つけた結果にしか一致しませんが、すべての結果を印刷する必要があります.どうすればいいですか?最初はjavaの影響でmatchの結果が集合すると思っていたので、どう考えてもまとまっていませんでした.その後scan法が発見された.コードは次のとおりです.

message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf" 
regex=/[a-z](\d{3})[a-z]/ 
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"} 
 
message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf" 
regex=/[a-z](\d{3})[a-z]/ 
message.scan(regex).each{|m|puts"Theresultis#{m[0]}"} 

簡単ですが、結果は次のとおりです.

Theresultis414 
Theresultis223 
Theresultis123 
 
Theresultis414 
Theresultis223 
Theresultis123 

どうですか、便利でしょう.簡単にすべてのマッチング結果を抽出しました.
正規表現のグループ化
正規表現をグループ化し、マッチングに成功した後、グループの値を$1,$2,$3,$4......に格納することができる.

print $1,"
",$2 if "a1b2c3d4e5" =~ /(\w{2})(\w*)/

文字列の正規置換:

print "abcd".sub(/\w/,"9") 
print "
" print "abcd".gsub(/\w/,"9")

正規の特殊なグローバル変数:
  •     $1,$2,$3....パケット一致テキスト
  • $`テキストに一致する前のテキスト
  • $'テキストに一致するテキスト
  • 
    print 
    ,"
    ",{1},"
    ", if "ab9cd" =~ /\d/