Java正則表現入門基本編(新米必見)

9175 ワード

正規表現はモードマッチングと置換のために使用できる仕様で、正規表現は普通の文字(たとえば文字aからzまで)と特殊文字(元文字)からなるテキストモードであり、テキスト本体を検索する際にマッチする1つまたは複数の文字列を記述するために使用されます。正規表現はテンプレートとして、検索した文字列にマッチします。
周知のように、プログラム開発においては、マッチング、検索、置換、判断文字列が必要となる場合がありますが、これらの状況は時には複雑で、純粋な符号化で解決すれば、プログラマの時間と精力を浪費することがよくあります。したがって、学習と正規表現の使用は、この矛盾を解決する主要な手段となります。
ご存知のように、正規表現はモードマッチングと置換のための規範であり、一つの正規表現は普通の文字(例えば、文字aからz)と特殊文字(元文字)からなる文字パターンであり、テキスト本体を検索する際にマッチする1つまたは複数の文字列を記述するために使用される。正規表現はテンプレートとして、検索した文字列にマッチします。
  jdk 1.4がjava.util.regexパッケージを発売してから、私達のためにとても良いJAVA正規表現応用プラットフォームを提供してくれました。
 正規表現は複雑な体系ですので、入門の概念を挙げます。もっと多いのは関連書籍と自分で模索してください。
//バックスラッシュ
//t間隔('/u 0009')
//n改行('/u 000 A')
/rバック('/u 000 D')
/d数字は[0-9]に等しい。
/D非数値は[^0-9]に等しい。
/sブランク記号[/t/n/x 0 B/f/r]
/S非空白記号[^/t/n/x 0 B/f/r]
/w単独文字[a-zA-Z_]0-9]
/W非個別文字[^a-zA-Z_]0-9]
/f変換子
//e Escape
/b単語の境界
/B単語以外の境界
/Gの前のマッチの終了
^制限の先頭
^java     条件はJavaで始まる文字に制限されています。
$は制限の最後です
java     条件はjavaを最後の文字に制限します。
..。  条件制限/n以外の任意の単独文字
java.     条件はjavaに制限されています。改行以外の任意の2文字です。
特定制限条件「[]」を追加します。
[a-z]     条件は小文字a to zの範囲の1文字に制限されます。
[A-Z]     条件は大文字A to Z範囲の1文字に制限されます。
[a-z A-Z]条件は、小文字a to zまたは大文字A to Zの範囲の1文字に制限されます。
[0-9]     条件は小文字0ト9の範囲の1文字に制限されます。
[0-9 a-z]条件は、小文字0ト9またはa to z範囲の1文字に制限されます。
[0-9[a-z]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
[]に^を加えて再制限条件[^]]を追加します。
[^a-z]     条件は小文字以外のA to z範囲の1文字に制限されます。
[^A-Z]     条件は大文字以外のA to Z範囲の1文字に制限されます。
[^a-z A-Z]条件は、小文字でないa to zまたは大文字A to Zの範囲の1文字に制限されます。
[^0-9]     条件は小文字0ト9以外の範囲の1文字に制限されます。
[^0-9 a-z]条件は、小文字0ト9またはa to zの範囲の1文字に制限されます。
[^0-9[a-z]]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
制限条件が特定文字で0回以上発生した場合は、「*」を使用することができます。
J*     0個以上J
..。     0以上の任意の文字
J.**D     JとDの間に0以上の任意の文字があります。
制限条件が特定の文字で1回以上発生した場合は「+」を使用できます。
J+。     1個以上J
..。     1つ以上の任意の文字
J.+D     JとDの間に1つ以上の任意の文字があります。
制限条件が特定の文字で0または1回以上発生した場合、「?」を使用することができます。
JA     JかJAが現れます
指定回数の連続表示に制限されています。「{a}」
J{2}     JJ。
J{3}     JJ
文字a個以上、そして「{a,}」
J{3,}     JJ、JJJJ、JJJJJ、3回以上J共存)
文字以上、b個以下「{a,b}」
J{3,5}     JJまたはJJJJまたはJJJJJ JJJ
両者は一つの「124」を取る
J 124 A     JまたはA
Java𞓜ハロー     JavaまたはHello
 「()」でグループのタイプを指定します。
例えば、私はindexの中の間のデータを調べたら、(.+?)
Pattern.co mpile関数を使用すると、正規表現の整合挙動を制御するパラメータを追加できます。
Pattern Pattern.co mpile(String regex,int flags)
flagsの取得範囲は以下の通りです。
Pattern.C.ANON_EQ     二つの文字の「正規分解(canonical decompation)」が完全に同じである場合にのみ、マッチングが認められます。例えば、このマークを使うと、「a/u 030 A」と表現が一致します。デフォルトでは「標準同等性」は考えられません。
Pattern.CC ASE_INSENSITIVE(i)     デフォルトでは、大文字小文字不明感のマッチングはUS-SCII文字セットのみに適用されます。このフラグは、表式を無視して大文字と小文字を一致させることができます。Unicodeの文字にサイズ不明感のマッチングをするには、UNIKODE(u)が必要です。CASEはこのマークと合わせればいいです。
Pattern.CC OMMENTS(x)     このようなモードでは、マッチング時にスペース記号は無視されます。注釈は葃から始まり、この行が終わるまで。埋め込みマークでUnix行モードを有効にできます。
Pattern.DOTALL(s)     このモードでは、表式'.'は任意の文字にマッチし、行を表す終端符を含む。デフォルトでは、表式''が行にマッチしない終端符です。
Pattern.MULTILINE
(?m)     このモードでは、'^''と'''は、それぞれ一行の開始と終了を一致させる。また、'^'は文字列の開始にマッチしています。'$も文字列にマッチして終了します。デフォルトでは、この2つの表現は文字列の開始と終了にのみマッチします。
Pattern.UNICODE_CASE
(?u)     このモードで、もしあなたがCASE_を有効にしたら。INSENSITIVEフラグは、Unicodeの文字に対して、大文字と小文字の区別のないマッチングを行います。デフォルトでは、大文字と小文字の不感度のマッチングはUS-SCII文字セットにのみ適用されます。
Pattern.UNIX_LINE(d)     このモードでは、'n'だけが一行の中止と見なされ、'.','^',''と一致します。
空泛の概念を抜きにして、簡単なJava正則のいくつかの用例を書き出します。
◆たとえば、文字列に検証が含まれている場合

//   Java  ,        
 Pattern pattern = Pattern.compile("^Java.*");
 Matcher matcher = pattern.matcher("Java   ");
 boolean b= matcher.matches();
 //      ,   true,    false
 System.out.println(b);
◆複数条件で文字列を分割する場合

Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
  System.out.println(strs[i]);
} 
◆テキスト置換(最初の文字が表示されます)

Pattern pattern = Pattern.compile("     ");
Matcher matcher = pattern.matcher("      Hello World,      Hello World");
//            
System.out.println(matcher.replaceFirst("Java"));
◆テキスト置換(全部)

Pattern pattern = Pattern.compile("     ");
Matcher matcher = pattern.matcher("      Hello World,      Hello World");
//            
System.out.println(matcher.replaceAll("Java"));
◆文字置換(置換文字)

Pattern pattern = Pattern.compile("     ");
Matcher matcher = pattern.matcher("      Hello World,      Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
  matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
◆メールアドレスであるか確認する
String str=「[email protected]
Pattern pattern=Pattern.co mpile("///w///////-"+@(//////-)+[/////]+[////w/-]+]Pattern.cASE_INSENSITIVE)
Match matcher=pattern.matcher(str);
System.out.println(matcher.matches();
◆htmlタグを除く

Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=/"index.html/">  </a>");
String string = matcher.replaceAll("");
System.out.println(string);
◆htmlでの対応条件文字列の検索

Pattern pattern = Pattern.compile("href=/"(.+?)/"");
Matcher matcher = pattern.matcher("<a href=/"index.html/">  </a>");
if(matcher.find())
 System.out.println(matcher.group(1));
}
◆http://住所の切り取り

//  url
Pattern pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){       
  buffer.append(matcher.group());    
  buffer.append("/r/n");       
System.out.println(buffer.toString());
}
◆指定{}のテキストを置換する

String str = "Java        {0} -{1} ";
String[][] object={new String[]{"//{0//}","1995"},new String[]{"//{1//}","2007"}};
System.out.println(replace(str,object));
public static String replace(final String sourceString,Object[] object) {
      String temp=sourceString;  
      for(int i=0;i<object.length;i++){
           String[] result=(String[])object[i];
        Pattern  pattern = Pattern.compile(result[0]);
        Matcher matcher = pattern.matcher(temp);
        temp=matcher.replaceAll(result[1]);
      }
      return temp;
}
◆指定されたディレクトリの下のファイルを正規の条件で照会する

//        
    private ArrayList files = new ArrayList();
    //        
    private String _path;
    //            
    private String _regexp;
    class MyFileFilter implements FileFilter {
       /**
        *       
        */
       public boolean accept(File file) {
        try {
         Pattern pattern = Pattern.compile(_regexp);
         Matcher match = pattern.matcher(file.getName());        
         return match.matches();
        } catch (Exception e) {
         return true;
        }
       }
      }
    /**
     *      
     * @param inputs
     */
    FilesAnalyze (String path,String regexp){
      getFileName(path,regexp);
    }
    /**
     *         files
     * @param input
     */
    private void getFileName(String path,String regexp) {
      //  
       _path=path;
       _regexp=regexp;
       File directory = new File(_path);
       File[] filesFile = directory.listFiles(new MyFileFilter());
       if (filesFile == null) return;
       for (int j = 0; j < filesFile.length; j++) {
        files.add(filesFile[j]);
       }
       return;
      }
    /**
     *       
     * @param out
     */
    public void print (PrintStream out) {
      Iterator elements = files.iterator();
      while (elements.hasNext()) {
        File file=(File) elements.next();
          out.println(file.getPath());  
      }
    }
    public static void output(String path,String regexp) {
      FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
      fileGroup1.print(System.out);
    }
    public static void main (String[] args) {
      output("C://","[A-z|.]*");
    }
Java正則の機能はまだたくさんありますが、実際には文字処理だけではできないことがあります。もちろん、正則の説明に時間がかかります。