Javaで正規表現で文字列を切り取る

2453 ワード

正規表現は文字列をマッチングする過程で広く応用されており、正規表現を熟練して身につけることができれば、学習作業で文字列に関する問題を解決することができます.
       JAva.util.regexパッケージのPatternクラスとMatcherクラスは、Javaにおける正規表現のソリューションを提供します.
       文字列として指定された正規表現は、まずこのようなインスタンスにコンパイルする必要があります.次に、取得したパターンをMatcherオブジェクトの作成に使用し、正規表現に従って任意の文字列と一致させることができます.マッチングを実行するすべてのステータスがマッチングに存在するため、複数のマッチングは同じモードを共有することができます.
したがって、典型的な呼び出し順序は
Pattern p = Pattern.compile("a*b");  //  "a*b" Pattern    
Matcher m = p.matcher("aaaaab");     //    "aaaaab"  
boolean b = m.matches();            //             
--【JDK 1.6ドキュメントより】
        シーン解析:文字列>>>「rows=[Rowcolumns=[1,c],Rowcolumns=[2,java],Rowcolumns=[3,ruby],Rowcolumns=[4,go],Rowcolumns=[5,python],Rowcolumns=[6,lua],Rowcolumns=[7,csharp],Rowcolumns=[8,ajax],Rowcolumns=[9,jsp]」;"
        []のデータ、すなわち1,c/2,java/3,rubyを切り取ります...
        では、上記の手順に従って、まず正則を書いてPatternクラスにコンパイルする例を書きます.上記の文字列には「rows=[」と「Rowcolumes=[」の2つの形態があるので、後ろのこの種の列に一致したいだけです.
        1.先頭に「ns=[」を直接選択して、先にこのサブストリングを書き出した式「ns」は具体的なアルファベットであり、変更する必要はない.「=」も「[」も特殊文字であり、エスケープを行う必要があるため、「ns=[」の正規表現は「ns=\[」であり、同じ理屈で末尾は「\」に一致する
        2.これで先頭に一致するが、切り取りたい文字列は先頭と末尾を付けたくないので、ゼロ幅の断言を用いる必要がある.例えば(?=exp)はexpで終わる文字列に一致することを表すが、一致した結果はexpを持たず、例えば(?=ing)はreadingをマッチングし、結果はread;(?<=exp)はexpで始まる文字列に一致するが、結果はexpを持たず、例えば(?<=read)マッチングreading、結果はing.これで私たちの問題はすべて解決し、ゼロ幅断言を用いて、冒頭マッチング「(?<=ns=\[)」、末尾マッチング「(?=\]」」
        3.先頭と末尾が完了したが、まだ中間で、我々のチームの間のデータは要求されていないため、直接「.*」(任意の文字が0回以上一致)と一致するが、ここで問題なのは、この式は貪欲であるため、完全な文字列、すなわち「(?<=ns=\[).*(?=\])」と一致した結果が「2,java」,Rowcolumns=[3,ruby],Rowcolumns=[4,go」である.,Rowcolumns=[5,python],Rowcolumns=[6,lua],Rowcolumns=[7,csharp],Rowcolumns=[8,ajax],Rowcolumns=[9,jsp],明らかに我々が望むものではないので,「?(前の内容は0回か1回マッチ)を追加する
        4.最後に切り取る必要があるサブストリングの正規表現は「(?<=ns=\[).*?(?=\])」
        5.Javaでの処理文字列の使用
Pattern pattern = Pattern.compile("(?<=ns\\=\\[).*?(?=\\])");
Matcher matcher = pattern2.matcher(string);
    while(matcher.find()){
	System.out.println(matcher.group());
	}

        ここで、一致する文字列を返すString group()メソッドがあり、上記の例では正規表現が1つのgroupしかないので、group()メソッドを直接呼び出せばよい.正規表現が「(//d+,)(//d+)」のように形成されている場合、左から右のn番目の括弧の正規表現にそれぞれ一致する3つのgroupがある.group()とgroup(0)等価で、正規表現全体に一致します.gruop(1)は「(//d+,)(//d+)」、group(2)は「//d+,」、group(3)は「//d+,」に一致します.以上のコードをコンパイルして実行すると、私たちが望む結果が得られます.
参照先:
正則基本用法1
正則基本用法2
group()の使い方
JDK Matcherドキュメント