正規表現-文字列から特定のコンテンツを取得する方法
2910 ワード
Web開発では、1つのメッセージから自分の必要なフィールド情報を取得することがよくありますが、このメッセージがJsonやXMLタイプであれば便利です.しかし、文字列であれば、次のようになります.
val str = “window.code=200;window.redirect_uri=\”wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARiFc26pwMtnUC2PBuJalkaS@qrticket_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576\”;”
以下に、私が微信ロボットを作ったときに出会った状況の1つです.この文字列からステータスコード(200)とジャンプするuri(wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=を取得する必要があります.ARiFc26pwMtnUC2PBuJalkaS@qrticket_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576)
最初は正規表現を知らなかったのですが、こんなにたくさんの表現のタイプを見て、こんなにたくさんのことを覚えているのか、時間をかけて覚えていても忘れてしまいました.だから私はずっと正規表現を深く理解していません.私もずっと正規表現があるモード列が存在するかどうかをマッチングするために使われていると思っていました.例えば、「hello word」にhelloがあるかどうかを検出するなど、多くのチュートリアルがこれを言っています.だから私は最初、文字列で特定の値を取得するには、str.sprit(";")のようなsprit()を使用しました.(0).sprit(「window.code=」)(1)は200まで取りに来ますが、文字列のフォーマットが永遠に変わらないことを前提としています.codeと=の間にスペースが1つ増えると、結果は必ずエラーになります.最も一般的なのは配列の境界を越えることです.その後、正規表現を話す文章を見て30分でチュートリアルに入りました.
私たちはグループ分けで優雅に上記の仕事を完成できることを発見しました.
まず直接コードをつけて、この中はjavaツールパッケージのregexを使いました
この正規表現を重点的に見てみましょう
.*window.code *= *(\d*).*window.redirect_uri *= *”(.*)”.*
まずこの表現を簡略化します
window.code=(\d*);window.redirect_uri=”(.*)”;
3つの引用符に含まれる文字列はScalaでも文字列の意味を表していますが、この中の特殊な文字にはエスケープ記号「」を付けなくても直感的に見えます.文字列に「」が含まれている場合は、特殊な文字にエスケープを付ける必要があります.
ここでd*はゼロまたは複数の数字を表します.0文字以上あることを表すが、なぜカッコで囲むのか.この中にはグループ、つまり次のグループが使われています.マッチングに成功する、すなわちbooleanがtrueであると、括弧に一致する文字列がgroupに格納され、groupの順序が1から数対の括弧がいくつかのgroupがあるので、その後group(1)から200、group(2)からwxを取得することができる.qq.com/……&scan=1492838576
コードの中でもっと複雑な正規表現については、スペースを判断したり、前後に余分な文字があるかどうかを判断したりするなど、特殊な状況の判断を加えたにほかならない.
最も重要なのはやはり具体的な問題の具体的な分析で、ここではグループ化の機能だけを話して、どのように1つの文字列の中から特定の内容を手に入れて、具体的なもっと深い正規表現の知識は私たちはこのチュートリアル(正規表現30分入門チュートリアル)の中で正しい表現を探すことができます
val str = “window.code=200;window.redirect_uri=\”wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARiFc26pwMtnUC2PBuJalkaS@qrticket_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576\”;”
以下に、私が微信ロボットを作ったときに出会った状況の1つです.この文字列からステータスコード(200)とジャンプするuri(wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=を取得する必要があります.ARiFc26pwMtnUC2PBuJalkaS@qrticket_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576)
最初は正規表現を知らなかったのですが、こんなにたくさんの表現のタイプを見て、こんなにたくさんのことを覚えているのか、時間をかけて覚えていても忘れてしまいました.だから私はずっと正規表現を深く理解していません.私もずっと正規表現があるモード列が存在するかどうかをマッチングするために使われていると思っていました.例えば、「hello word」にhelloがあるかどうかを検出するなど、多くのチュートリアルがこれを言っています.だから私は最初、文字列で特定の値を取得するには、str.sprit(";")のようなsprit()を使用しました.(0).sprit(「window.code=」)(1)は200まで取りに来ますが、文字列のフォーマットが永遠に変わらないことを前提としています.codeと=の間にスペースが1つ増えると、結果は必ずエラーになります.最も一般的なのは配列の境界を越えることです.その後、正規表現を話す文章を見て30分でチュートリアルに入りました.
私たちはグループ分けで優雅に上記の仕事を完成できることを発見しました.
まず直接コードをつけて、この中はjavaツールパッケージのregexを使いました
import java.util.regex.Pattern
// Scala,java , pattern
val str = "window.code=200;window.redirect_uri=\"wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARiFc26pwMtnUC2PBuJalkaS@qrticket_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576\";"
val pattern = Pattern.compile(""".*window.code *= *(\d*).*window.redirect_uri *= *"(.*)".*""")
val matcher = pattern.matcher(str)
val boolean = matcher.matches()//true or false
val code = matcher.group(1)//200
val uri = matcher.group(2)//wx.qq.com.....
この正規表現を重点的に見てみましょう
.*window.code *= *(\d*).*window.redirect_uri *= *”(.*)”.*
まずこの表現を簡略化します
window.code=(\d*);window.redirect_uri=”(.*)”;
3つの引用符に含まれる文字列はScalaでも文字列の意味を表していますが、この中の特殊な文字にはエスケープ記号「」を付けなくても直感的に見えます.文字列に「」が含まれている場合は、特殊な文字にエスケープを付ける必要があります.
ここでd*はゼロまたは複数の数字を表します.0文字以上あることを表すが、なぜカッコで囲むのか.この中にはグループ、つまり次のグループが使われています.マッチングに成功する、すなわちbooleanがtrueであると、括弧に一致する文字列がgroupに格納され、groupの順序が1から数対の括弧がいくつかのgroupがあるので、その後group(1)から200、group(2)からwxを取得することができる.qq.com/……&scan=1492838576
コードの中でもっと複雑な正規表現については、スペースを判断したり、前後に余分な文字があるかどうかを判断したりするなど、特殊な状況の判断を加えたにほかならない.
最も重要なのはやはり具体的な問題の具体的な分析で、ここではグループ化の機能だけを話して、どのように1つの文字列の中から特定の内容を手に入れて、具体的なもっと深い正規表現の知識は私たちはこのチュートリアル(正規表現30分入門チュートリアル)の中で正しい表現を探すことができます