[Java]正規表現


正規表現


正規表現Regular Expressionは、テキストデータにおいて所望の条件패턴に一致する文字列を検索するための文字列であり、予め定義された記号および文字を用いて作成された文字列である.
正規表現を使用すると、大量のテキストから必要なデータを簡単に抽出し、入力したデータがフォーマットに合致していることを確認できます.
基本的な使い方は以下の通りです.
Javaでの一般式の使用
1.正規表現をパラメータとしてPatternクラスの静的方法Pattern.compile(String regex)を呼び出してPattern例を得る
Pattern pattern = Pattern.compile("c[a-z]*");
2.従来の比較対象をパラメータとして、PatternクラスのMatcher.matcher(CharSeqeunce input)を呼び出し、Matcher例を得る
Matcher matcher = pattern.matcher(/* 체크할 대상 문자열 */);
3.Matcherインスタンスに対してboolean matches()が呼び出され、正規表現に合致するかどうかを確認する
if(matcher.matches())
Pattern p = Pattern.compile("a*"); 	// 맨 앞에 a를 포함한 모든 문자열, 
									//a 자체도 포함되요
Matcher m = p.matcher("a");
m.matches();						// true

m = p.matcher("ab");				
m.matches();						// true

m = p.matcher("baa");				
m.matches();						// false

モードキー


よく使うキーワードを整理してすべてのものを整理する量が多いので、頻度の高いものを整理しましょうハハ.
パターン説明[A-z]すべての小文字[A-Z]すべての大文字[A-zA-Z]すべてのアルファベット[A-zA-Z 0-9]すべてのアルファベットと数字*0以上のすべての文字、a*であればaから始まるすべての文字列.すべての文字列[a|b]aまたはbc.*tcで始まる、tで終わるすべての文字列wすべての文字列dすべての数字+1つ以上の文字、*とは異なり、1つでなければなりません.2つの文字列{2}は個数を表す.{1,2}以下の文字列ではありません{^b|c}bまたはc(ただしこれではすべての文字列ですねハハ)
下のソースをぐるっと回してから焼きます

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegularEx2 {
    public static void main(String[] args) {
        String[] data = {
            "bat", "baby", "bonus", "c", "cA", "ca", "co",
            "c.", "c0", "c#", "car", "combat", "count", "date", "disc"
        };

        // 역슬래쉬는 두번 쳐야 인식되요
        String[] pattern = {
            ".*", "c[a-z]*", "c[a-z]", "c[a-zA-Z]",
            "c[a-zA-Z0-9]", "c.", "c.*", "c\\.", "c\\w", "c\\d",
            "c.*t", "[b|c]", ".*a.+", "[b|c].{2}"
        };

        for(int x = 0; x < pattern.length; ++x){
            Pattern p = Pattern.compile(pattern[x]);
            System.out.print("Pattern : " + pattern[x] + ", 결과 : ");
            for(int i = 0 ; i < data.length; ++i){
                if(p.matcher(data[i]).matches()){
                    System.out.print(data[i] + ", ");
                }
            }
            System.out.println();
        }
    }
}

一般グループ


正規式の一部は括弧で囲まれており、Groupingに組み合わせることができる.組み合わせられた部分は、1つの単位で組み合わせられたものに相当し、1つまたは複数の繰り返しを表す+または*の後、組み合わせられた部分が適用対象となる.そしてペアの夫婦はgroup(int i)で分けてもらうことができます
String source = "HP:011-1111-1111, HOME:02-9999-9999";
// 괄호로 그룹화!
String pattern = "(0\\d{1,2})-(\\d{3,4})-(\\d{3,4})";

Matcher m = Pattern.compile(pattern).matcher(source);
int i = 0;
while(m.find()){
	System.out.println(++i + ": " + m.group() + " -> " + m.group(1)
							+ ", "+ m.group(2) + ", " + m.group(3));
}
// 결과 : 
// 1: 011-1111-1111 ->011, 1111, 1111
// 2: 02-9999-9999 ->02, 9999, 9999
例を見るとかっこでグループ化されていることがわかります次に、group()またはgroup(0)が文字列全体を分割せずに返されるのを見ることができます.find()パターンに一致する部分が所与のソース内で見つかった場合、trueに戻り、見つからなかった場合、falseに戻る.これは内部でカーソルであり、1回の操作を実行すると、以前に発見されたモードと一致する部分から、モードマッチングの次のものを検索します.
また、正規表現に一致する部分をMatcherfind()で検索すると、start()およびend()として配置し、appendReplacement(StringBuffer sb, String replacement)を使用して所望の文字列に変換することができる.結果はパラメータsbに格納される.
String source = "A broken hand works, but not a broken heart.";
String pattern = "broken";
StringBuffer sb = new StringBuffer();

Matcher m = Pattern.compile(pattern).matcher(source);

int i = 0;
while(m.find()){
	System.out.println(++i + "번째 매칭 : " + m.start() + "~" + m.end());
	// broken을 drunken으로 치환하여 sb에 저장해요.
	m.appendReplacement(sb, "drunken");
}
m.appendTail(sb);
最後にappendTailが追加され、これについて説明すると、while文は、元の文字列のbrokendrunkenに変換する動作を実行する.
最初のfind()メソッドはtrueを返し、Matcherインスタンスは元の文字列の最初のbroken部分を指す.
このとき、Matcher.groupbrokenに戻る.次にsbに貼り付け、この点でsbは以下の値を含む.
"A drunken"
このようにパターンが一致する部分に貼り付けます次に2番目のbrokenを見つけて置き換えると、sbには次の文字列があります.
"A drunken hand works,  but not a drunken"
だからMatcher.appendTail(sb)を運転して、残りの部分を入らせます.この方法は、最後に一致した文字列をsbに追加する方法を意味する.
"A drunken hand works,  but not a drunken heart."
したがって、実際にはAPIの説明にもappendReplacementが実行された後に呼び出されると書かれている.

リファレンス


Spread your wingsブログ