キャプチャされたグループを操作する方法
アプリケーションのソース コードにRegexDemo
はメソッド呼び出しが含まれていますm.group()
。このメソッドは、キャプチャされたグループを操作することを目的とし group()
たクラスのいくつかのメソッドのうちの 1 つです。Matcher
-
このメソッドは、
int groupCount()
リゾルバー パターンでキャプチャされたグループの数を返します。この数値には、パターン全体に対応する特別なキャプチャ グループ番号 0 は考慮されていません。 -
このメソッドは、
String group()
見つかった以前の一致の文字を返します。空の文字列の検索が成功したことを報告するために、このメソッドは空の文字列を返します。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは
String group(int group)
前のメソッドと似ていますが、パラメータで指定されたグループ番号によってキャプチャされ、見つかった以前の一致の文字を返す点が異なりますgroup
。これは とgroup(0)
同等であることに注意してくださいgroup()
。テンプレートに指定された番号のキャプチャされたグループがない場合、メソッドは例外をスローしますIndexOutOfBoundsException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは、
String group(String name)
名前グループによってキャプチャされた、以前に見つかった一致の文字を返します。キャプチャされたグループ名がテンプレートにない場合は、例外がスローされますIllegalArgumentException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。
groupCount()
次の例は、およびメソッドの使用法を示していますgroup(int group)
。
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
実行結果:
3
0: abc
1: abc
2: bc
3: c
一致位置の決定方法
このクラスには、Matcher
一致の開始位置と終了位置を返すメソッドがいくつか用意されています。
-
このメソッドは、
int start()
見つかった以前の一致の開始位置を返します。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは
int start(int group)
前のメソッドと似ていますが、パラメータで指定された番号を持つグループで見つかった以前の一致の開始位置を返しますgroup
。テンプレートに指定された番号のキャプチャされたグループがない場合、メソッドは例外をスローしますIndexOutOfBoundsException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは
int start(String name)
前のメソッドと似ていますが、 というグループで見つかった以前の一致の開始位置を返しますname
。キャプチャされたグループがname
テンプレートにない場合は、例外がスローされますIllegalArgumentException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは、
int end()
見つかった前回の一致の最後の文字の位置に 1 を加えた値を返します。マッチャーがまだ一致を実行していない場合、または前回の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは
int end(int group)
前のメソッドと似ていますが、パラメータで指定された番号を持つグループで見つかった以前の一致の終了位置を返しますgroup
。テンプレートに指定された番号のキャプチャされたグループがない場合、メソッドは例外をスローしますIndexOutOfBoundsException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。 -
このメソッドは
int end(String name)
前のメソッドと似ていますが、 というグループで見つかった前の一致の終了位置を返しますname
。キャプチャされたグループがname
テンプレートにない場合は、例外がスローされますIllegalArgumentException
。リゾルバーが検索をまだ実行していない場合、または以前の検索操作が失敗した場合は、例外がスローされますIllegalStateException
。
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
System.out.println("Найдено " + m.group(2));
System.out.println(" начинается с позиции " + m.start(2) +
" и заканчивается на позиции " + (m.end(2) - 1));
System.out.println();
}
この例の出力は次のとおりです。
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
PatternSyntaxException クラスのメソッド
クラスのインスタンスは、PatternSyntaxException
正規表現の構文エラーを記述します。このような例外はメソッドcompile()
とmatches()
クラスからスローされPattern
、次のコンストラクターを通じて形成されます。 PatternSyntaxException(String desc, String regex, int index)
このコンストラクターには、指定された説明 ( desc
)、正規表現( regex
)、および構文エラーが発生した位置が格納されます。構文エラーの場所が不明な場合、値はindex
に設定されます-1
。おそらく、 のインスタンスを作成する必要はありませんPatternSyntaxException
。ただし、フォーマットされたエラー メッセージを作成する場合は、上記の値を抽出する必要があります。これを行うには、次の方法を使用できます。
- このメソッドは
String getDescription()
構文エラーの説明を返します。 - このメソッドは、
int getIndex()
エラーが発生した位置を返すか、位置が不明な場合は -1 を返します。 - このメソッドは
String getPattern()
無効な正規表現を返します。
String getMessage()
テンプレート内のどこで構文エラーが発生したかを視覚的に示すとともに、以前のメソッドから返された値を含む複数行の文字列を返します。構文エラーとは何ですか? 以下に例を示します。 java RegexDemo (?itree Treehouse
この場合、)
ネストされたフラグ式で右括弧のメタキャラクター ( ) を指定するのを忘れています。このエラーの出力は次のとおりです。
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Regex API を使用して便利な正規表現アプリケーションを構築する
正規表現を使用すると、強力なテキスト処理アプリケーションを作成できます。このセクションでは、Regex API のクラスとメソッドをさらに詳しく調べるきっかけとなる 2 つの便利なアプリケーションを紹介します。2 番目の付録では、字句解析を実行するための再利用可能なコード ライブラリである Lexan を紹介します。正規表現とドキュメント
ドキュメントの作成は、プロフェッショナル ソフトウェアを開発する際に必須のタスクの 1 つです。幸いなことに、正規表現はドキュメント作成のさまざまな側面で役立ちます。リスト 1 のコードは、単一行および複数行の C スタイル コメントを含む行をソース ファイルから抽出し、別のファイルに書き込みます。コードが機能するには、コメントが同じ行にある必要があります。リスト 1. コメントの取得import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class ExtCmnt
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("Способ применения: java ExtCmnt infile outfile");
return;
}
Pattern p;
try
{
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
}
catch (PatternSyntaxException pse)
{
System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
System.err.printf("Описание ошибки: %s%n", pse.getDescription());
System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
return;
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
Matcher m = p.matcher("");
String line;
while ((line = br.readLine()) != null)
{
m.reset(line);
if (m.matches()) /* Должна соответствовать вся строка */
{
bw.write(line);
bw.newLine();
}
}
}
catch (IOException ioe)
{
System.err.println(ioe.getMessage());
return;
}
}
}
リスト 1 のメソッドは、main()
まずコマンドライン構文が正しいかどうかをチェックし、次に単一行および複数行のコメントを検出するように設計された正規表現をクラス オブジェクトにコンパイルしますPattern
。例外が発生しない場合PatternSyntaxException
、メソッドはmain()
ソース ファイルを開き、ターゲット ファイルを作成し、読み取られた各行をパターンと照合するマッチャーを取得して、ソース ファイルを 1 行ずつ読み取ります。行ごとに、コメント パターンと照合されます。成功すると、メソッドはmain()
文字列 (その後に改行) をターゲット ファイルに書き込みます (ファイル I/O ロジックについては、今後の Java 101 チュートリアルで説明します)。リスト 1 を次のようにコンパイルします。 ファイルを入力 javac ExtCmnt.java
としてアプリケーションを実行します。 ファイル出力に次の結果が得られます。 ExtCmnt.java
java ExtCmnt ExtCmnt.java out
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
パターン string では.*/\\*.*\\*/|.*//.*$
、パイプ メタキャラクタは|
論理 OR 演算子として機能し、マッチャーが指定された正規表現構造の左側のオペランドを使用してマッチャー テキスト内で一致を見つける必要があることを示します。一致するものがない場合、マッチャーは、指定された正規表現構造の正しいオペランドを使用して別の検索を試みます (キャプチャされたグループのかっこのメタ文字も論理演算子を形成します)。 Java の正規表現、パート 5
GO TO FULL VERSION