Java-正規表現
Javaは、正規表現とのパターンマッチング用のjava.util.regexパッケージを提供します。Javaの正規表現は、Perlプログラミング言語と非常によく似ており、習得が非常に簡単です。
正規表現は、パターンに保持された特殊な構文を使用して、他の文字列または文字列のセットを照合または検索するのに役立つ特殊な文字シーケンスです。これらは、テキストやデータの検索、編集、または操作に使用できます。
java.util.regexパッケージは、主に次の3つのクラスで構成されています-
Pattern Class−パターンオブジェクトは、正規表現をコンパイルした表現です。Patternクラスは、パブリックコンストラクターを提供しません。パターンを作成するには、最初にそのパブリックスタティックの1つを呼び出す必要がありますcompile()その後、Patternオブジェクトを返すメソッド。これらのメソッドは、最初の引数として正規表現を受け入れます。
Matcher Class− Matcherオブジェクトは、パターンを解釈し、入力文字列に対して一致操作を実行するエンジンです。Patternクラスと同様に、Matcherはパブリックコンストラクターを定義しません。を呼び出すことにより、Matcherオブジェクトを取得しますmatcher() Patternオブジェクトのメソッド。
PatternSyntaxException − PatternSyntaxExceptionオブジェクトは、正規表現パターンの構文エラーを示すチェックされていない例外です。
グループのキャプチャ
グループのキャプチャは、複数の文字を1つのユニットとして扱う方法です。これらは、グループ化する文字を括弧のセット内に配置することによって作成されます。たとえば、正規表現(dog)は、文字「d」、「o」、および「g」を含む単一のグループを作成します。
キャプチャグループは、左から右に開いた括弧を数えることによって番号が付けられます。たとえば、式((A)(B(C)))には、このようなグループが4つあります。
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
式に存在するグループの数を確認するには、マッチャーオブジェクトでgroupCountメソッドを呼び出します。groupCountメソッドはint マッチャーのパターンに存在するキャプチャグループの数を示します。
常に式全体を表す特別なグループ、グループ0もあります。このグループは、groupCountによって報告される合計には含まれません。
Example
次の例は、指定された英数字の文字列から数字列を見つける方法を示しています。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
}else {
System.out.println("NO MATCH");
}
}
}
これにより、次の結果が生成されます-
Output
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
正規表現の構文
これは、Javaで使用可能なすべての正規表現メタ文字構文をリストした表です。
部分式 | マッチス |
---|---|
^ | 行の先頭に一致します。 |
$ | 行の終わりに一致します。 |
。 | 改行以外の任意の1文字に一致します。使用するm オプションを使用すると、改行にも一致させることができます。 |
[...] | 角かっこ内の任意の1文字に一致します。 |
[^ ...] | 角かっこで囲まれていない任意の1文字に一致します。 |
\ A | 文字列全体の始まり。 |
\ z | 文字列全体の終わり。 |
\ Z | 許容される最終行ターミネータを除く文字列全体の終わり。 |
re * | 前の式の0回以上の出現に一致します。 |
re + | 前のものの1つ以上に一致します。 |
再? | 前の式の0または1回の出現に一致します。 |
re {n} | 前の式のn回の出現に正確に一致します。 |
re {n、} | 前の式のn回以上の出現に一致します。 |
re {n、m} | 前の式の少なくともn回および最大m回の出現に一致します。 |
a | b | aまたはbのいずれかに一致します。 |
(再) | 正規表現をグループ化し、一致したテキストを記憶します。 |
(?:再) | 一致したテキストを記憶せずに正規表現をグループ化します。 |
(?> re) | バックトラックなしで独立したパターンに一致します。 |
\ w | 単語の文字と一致します。 |
\ W | 単語以外の文字と一致します。 |
\ s | 空白に一致します。[\ t \ n \ r \ f]と同等です。 |
\ S | 非空白に一致します。 |
\ d | 数字と一致します。[0-9]に相当します。 |
\ D | 数字以外に一致します。 |
\ A | 文字列の先頭に一致します。 |
\ Z | 文字列の終わりに一致します。改行が存在する場合は、改行の直前と一致します。 |
\ z | 文字列の終わりに一致します。 |
\ G | 最後の試合が終了したポイントに一致します。 |
\ n | キャプチャグループ番号「n」への後方参照。 |
\ b | 角かっこ外の場合、単語の境界に一致します。角かっこ内の場合、バックスペース(0x08)と一致します。 |
\ B | 単語以外の境界に一致します。 |
\ n、\ tなど。 | 改行、キャリッジリターン、タブなどに一致します。 |
\ Q | \ Eまでのすべての文字をエスケープ(引用)します。 |
\ E | \ Qで始まる引用を終了します。 |
マッチャークラスのメソッド
これが便利なインスタンスメソッドのリストです-
インデックスメソッド
インデックスメソッドは、入力文字列のどこで一致が見つかったかを正確に示す便利なインデックス値を提供します-
シニア番号 | 方法と説明 |
---|---|
1 | public int start() 前の一致の開始インデックスを返します。 |
2 | public int start(int group) 前の一致操作中に指定されたグループによってキャプチャされたサブシーケンスの開始インデックスを返します。 |
3 | public int end() 最後に一致した文字の後のオフセットを返します。 |
4 | public int end(int group) 前の一致操作中に指定されたグループによってキャプチャされたサブシーケンスの最後の文字の後のオフセットを返します。 |
学習方法
スタディメソッドは入力文字列を確認し、パターンが見つかったかどうかを示すブール値を返します-
シニア番号 | 方法と説明 |
---|---|
1 | public boolean lookingAt() 領域の先頭から始まる入力シーケンスをパターンと照合しようとします。 |
2 | public boolean find() パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。 |
3 | public boolean find(int start) このマッチャーをリセットしてから、指定されたインデックスから開始して、パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。 |
4 | public boolean matches() 領域全体をパターンと照合しようとします。 |
交換方法
置換メソッドは、入力文字列内のテキストを置換するための便利なメソッドです。
シニア番号 | 方法と説明 |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) 非終端記号の追加と置換のステップを実装します。 |
2 | public StringBuffer appendTail(StringBuffer sb) 端末の追加と置換のステップを実装します。 |
3 | public String replaceAll(String replacement) パターンに一致する入力シーケンスのすべてのサブシーケンスを、指定された置換文字列に置き換えます。 |
4 | public String replaceFirst(String replacement) パターンに一致する入力シーケンスの最初のサブシーケンスを、指定された置換文字列に置き換えます。 |
5 | public static String quoteReplacement(String s) 指定された文字列のリテラル置換文字列を返します。このメソッドは、リテラル置換として機能する文字列を生成しますs MatcherクラスのappendReplacementメソッド内。 |
開始メソッドと終了メソッド
以下は、「cat」という単語が入力文字列に出現する回数をカウントする例です。
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main( String args[] ) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
これにより、次の結果が生成されます-
Output
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
この例では、単語の境界を使用して、文字「c」、「a」、「t」が長い単語の単なる部分文字列ではないことを確認していることがわかります。また、入力文字列のどこで一致が発生したかについての有用な情報も提供します。
startメソッドは、前の一致操作中に指定されたグループによってキャプチャされたサブシーケンスの開始インデックスを返し、endは、最後に一致した文字のインデックスに1を加えたものを返します。
一致とlookingAtメソッド
matchsメソッドとlookingAtメソッドはどちらも、入力シーケンスをパターンと照合しようとします。ただし、違いは、一致には入力シーケンス全体が一致する必要があるのに対し、lookingAtは一致しないことです。
どちらのメソッドも、常に入力文字列の先頭から始まります。これが機能を説明する例です-
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
public static void main( String args[] ) {
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Current REGEX is: "+REGEX);
System.out.println("Current INPUT is: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
これにより、次の結果が生成されます-
Output
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
replaceFirstメソッドとreplaceAllメソッド
replaceFirstメソッドとreplaceAllメソッドは、指定された正規表現に一致するテキストを置き換えます。名前が示すように、replaceFirstは最初のオカレンスを置き換え、replaceAllはすべてのオカレンスを置き換えます。
これが機能を説明する例です-
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
これにより、次の結果が生成されます-
Output
The cat says meow. All cats say meow.
appendReplacementメソッドとappendTailメソッド
Matcherクラスは、テキスト置換用のappendReplacementメソッドとappendTailメソッドも提供します。
これが機能を説明する例です-
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
これにより、次の結果が生成されます-
Output
-foo-foo-foo-
PatternSyntaxExceptionクラスメソッド
PatternSyntaxExceptionは、正規表現パターンの構文エラーを示すチェックされていない例外です。PatternSyntaxExceptionクラスは、何がうまくいかなかったかを判断するのに役立つ次のメソッドを提供します。
シニア番号 | 方法と説明 |
---|---|
1 | public String getDescription() エラーの説明を取得します。 |
2 | public int getIndex() エラーインデックスを取得します。 |
3 | public String getPattern() 誤った正規表現パターンを取得します。 |
4 | public String getMessage() 構文エラーとそのインデックスの説明、誤った正規表現パターン、およびパターン内のエラーインデックスの視覚的表示を含む複数行の文字列を返します。 |