[Java]正規表現
21036 ワード
正規表現
正規表現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回の操作を実行すると、以前に発見されたモードと一致する部分から、モードマッチングの次のものを検索します.
また、正規表現に一致する部分をMatcher
のfind()
で検索すると、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文は、元の文字列のbroken
をdrunken
に変換する動作を実行する.
最初のfind()
メソッドはtrueを返し、Matcher
インスタンスは元の文字列の最初のbroken
部分を指す.
このとき、Matcher.group
はbroken
に戻る.次に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ブログ
Reference
この問題について([Java]正規表現), 我々は、より多くの情報をここで見つけました
https://velog.io/@redgem92/Java-정규식
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Pattern pattern = Pattern.compile("c[a-z]*");
Matcher matcher = pattern.matcher(/* 체크할 대상 문자열 */);
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
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();
}
}
}
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
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);
"A drunken"
"A drunken hand works, but not a drunken"
"A drunken hand works, but not a drunken heart."
Spread your wingsブログ
Reference
この問題について([Java]正規表現), 我々は、より多くの情報をここで見つけました https://velog.io/@redgem92/Java-정규식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol