Rubyにおける正規表現による文字列のマッチングと置換操作の詳細
2953 ワード
正規一致
Rubyといえば、もちろんその正規表現メカニズムを提唱しなければならない.正規表現は強力なマッチング言語として、文字列検証、マッチング、ウェブページ抽出など、さまざまな分野で使用されている.正規表現とのマッチング効率を非難する人もいるが、正規表現の強力なマッチング能力を考えるとどうでもいい.
ルビーの正規表現といえばルビーの=~とmatchの2つのマッチング方式を言わないわけにはいかないので、この2つのマッチング方式の違いを実例で説明しましょう.まず、=~の使い方を話しましょう.
Rubyでは正規表現一致文を//で表しています.実行してみてください.上の文は、3つの数字の両方が小文字の文字列に一致しています.上記のコードを実行すると、結果10が表示されます.なぜ10という結果が出たのか不思議に思うでしょうが、これが=~の魅力で、彼はマッチング結果の最初の出現位置を印刷しています.
では、matchを見てみましょう.
出力結果を見てみましょう:f 414 j.この文字列は、正規文が一致するルールに合致するすべての結果セットを表します.みんなが気づいたかどうか分かりませんが、私たちは正規表現の中で括弧を使っています.私たちは3つの数字を抽出すればいいと思っています.もちろんこれも簡単です.上のコードで少し修正するだけです.
結果は当然414である.なぜ$0ではなく$1を使うのか、$0の結果を見てみましょう.
出力されたオブジェクト情報です.
次に、文字列の中にルールに合った情報がたくさんあるとしたらどうしますか.上の文は最初に見つけた結果にしか一致しませんが、すべての結果を印刷する必要があります.どうすればいいですか?最初はjavaの影響でmatchの結果が集合すると思っていたので、どう考えてもまとまっていませんでした.その後scan法が発見された.コードは次のとおりです.
簡単ですが、結果は次のとおりです.
どうですか、便利でしょう.簡単にすべてのマッチング結果を抽出しました.
正規表現のグループ化
正規表現をグループ化し、マッチングに成功した後、グループの値を$1,$2,$3,$4......に格納することができる.
文字列の正規置換:
正規の特殊なグローバル変数: $1,$2,$3....パケット一致テキスト $`テキストに一致する前のテキスト $'テキストに一致するテキスト
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")
正規の特殊なグローバル変数:
print ,"
",{1},"
",
if "ab9cd" =~ /\d/