正規表現は文字列のパターンを定義します。
正規表現は、テキストの検索、編集、操作に使用できます。
正規表現は 1 つの言語に限定されませんが、言語ごとに微妙な違いがあります。
Java の正規表現は Perl の正規表現に最も似ています。
java.util.regex パッケージには主に次の 3 つのクラスが含まれています。
パターンクラス:
パターン オブジェクトは、正規表現のコンパイルされた表現です。パターン クラスにはパブリック コンストラクターがありません。 Pattern オブジェクトを作成するには、まずそのパブリック静的コンパイル メソッドを呼び出す必要があります。このメソッドは Pattern オブジェクトを返します。このメソッドは、最初のパラメータとして正規表現を受け入れます。
マッチャークラス:
Matcher オブジェクトは、入力文字列を解釈して照合するエンジンです。 Pattern クラスと同様に、Matcher にはパブリック コンストラクターがありません。 Matcher オブジェクトを取得するには、Pattern オブジェクトの matcher メソッドを呼び出す必要があります。
パターン構文例外:
PatternSyntaxException は、正規表現パターンの構文エラーを表す非必須の例外クラスです。
キャプチャ グループは、複数の文字を 1 つの単位として扱う方法であり、括弧内で文字をグループ化することによって作成されます。
たとえば、正規表現 (dog) は、「d」、「o」、および「g」を含む 1 つのグループを作成します。
キャプチャ グループには、左かっこを左から右に数えることによって番号が付けられます。たとえば、式 ((A)(B(C))) には、そのようなグループが 4 つあります。
((A)(B(C)))
(A)
(紀元前))
(C)
matcher オブジェクトの groupCount メソッドを呼び出すことで、式に含まれるグループの数を確認できます。 groupCount メソッドは int 値を返し、マッチャー オブジェクトに現在複数のキャプチャ グループがあることを示します。
常に式全体を表す特別なグループ (グループ 0) もあります。 groupCountの戻り値にはグループは含まれません。
次の例は、指定された文字列から数字の文字列を検索する方法を示しています。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス RegexMatches
{
public static void main( String args[] ){
// 指定されたパターンに従って文字列を検索します。 String line = "この注文は QT3000 に対して行われました! OK?";
文字列パターン = "(.*)(\d+)(.*)";
//パターンオブジェクトを作成パターン r = Pattern.compile(pattern);
// 次にマッチャー オブジェクトを作成します Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("見つかった値: " + m.group(0) );
System.out.println("見つかった値: " + m.group(1) );
System.out.println("見つかった値: " + m.group(2) );
} それ以外 {
System.out.println("一致しません");
}
}
}
上記の例のコンパイルと実行結果は次のとおりです。
見つかった値: この注文は QT3000 で行われました。
見つかった値: この注文は QT300 に対して行われました
見つかった値: 0
キャラクター | 説明する |
---|---|
次の文字を特殊文字、テキスト、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字と一致します。シーケンス「\」は「」と一致し、「(」は「(」と一致します。 | |
^ | 入力文字列の先頭と一致します。 RegExpオブジェクトのMultilineプロパティが設定されている場合、^ は "n" または "r" の後の位置にも一致します。 |
$ | 入力文字列の末尾と一致します。 RegExpオブジェクトのMultilineプロパティが設定されている場合、$ は "n" または "r" の前の位置にも一致します。 |
* | 直前の文字または部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} に相当します。 |
+ | 先行する文字または部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」に一致しますが、「z」には一致しません。 + {1,} と同等。 |
? | 直前の文字または部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」の「do」と一致します。 ? {0,1} に相当します。 |
{ n } | n は負ではない整数です。 n回正確に一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の両方の「o」には一致します。 |
{ n ,} | n は負ではない整数です。少なくともn回一致します。たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」と一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。 |
{ n 、 m } | Mとn は非負の整数であり、 n <= mです。少なくともn回、最大でm回一致します。たとえば、「o{1,3}」は「fooooood」の最初の 3 つの o と一致します。 「o{0,1}」は「o?」と同等です。注: カンマと数字の間にスペースを挿入することはできません。 |
? | この文字が他の修飾子 (*、+、?、{ n }、{ n ,}、{ n , m }) の直後にある場合、一致パターンは「非貪欲」です。 「非貪欲」パターンは可能な限り短い文字列に一致しますが、デフォルトの「貪欲」パターンは可能な限り長い文字列に一致します。たとえば、文字列「oooo」では、「o+?」は 1 つの「o」のみに一致しますが、「o+」はすべての「o」に一致します。 |
。 | 「rn」を除く任意の 1 文字と一致します。 「rn」を含む任意の文字と一致するには、「[sS]」などのパターンを使用します。 |
(パターン) | パターンと一致し、一致する部分式を取得します。キャプチャされた一致は、 $0 ~ $9属性を使用して、結果の「一致」コレクションから取得できます。大括弧文字 ( ) と一致させるには、「(」または「)」を使用します。 |
(?:パターン) | パターンに一致するが、一致をキャプチャしない部分式。つまり、非キャプチャ一致であり、後で使用するために一致を保存しません。これは、「または」文字 (|) を使用してパターン部分を結合する場合に便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも経済的な表現です。 |
(?=パターン) | patternに一致する文字列の先頭にある文字列と一致する前方検索を実行する部分式。これは非キャプチャ一致、つまり、後で使用するためにキャプチャできない一致です。たとえば、「Windows (?=95|98|NT|2000)」は、「Windows 2000」の「Windows」には一致しますが、「Windows 3.1」の「Windows」には一致しません。予測先読みは文字を占有しません。つまり、一致が発生した後、予測先読みを構成する文字の後ではなく、前の一致の直後に次の一致が検索されます。 |
(?!パターン) | patternに一致する文字列の先頭にない検索文字列と一致する後方検索を実行する部分式。これは非キャプチャ一致、つまり、後で使用するためにキャプチャできない一致です。たとえば、「Windows (?!95|98|NT|2000)」は、「Windows 3.1」の「Windows」には一致しますが、「Windows 2000」の「Windows」には一致しません。予測先読みは文字を占有しません。つまり、一致が発生した後、予測先読みを構成する文字の後ではなく、前の一致の直後に次の一致が検索されます。 |
x | y | xまたはyと一致します。たとえば、「z|food」は「z」または「food」と一致します。 '(z|f)ood' は、「zood」または「food」と一致します。 |
[ xyz ] | キャラクターセット。に含まれる任意の文字と一致します。たとえば、「[abc]」は「plain」の「a」と一致します。 |
[^ xyz ] | 文字セットを逆にします。含まれていない文字と一致します。たとえば、「[^abc]」は「plain」の「p」、「l」、「i」、および「n」に一致します。 |
[ az ] | 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[az]」は「a」から「z」までの範囲内の任意の小文字と一致します。 |
[^ az ] | 逆範囲文字。指定された範囲内にない任意の文字と一致します。たとえば、「[^az]」は「a」から「z」の範囲にない任意の文字に一致します。 |
b | 単語の境界、つまり単語とスペースの間の位置と一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。 |
B | 非単語境界マッチング。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。 |
cx | xで示される制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 xの値は、AZ または AZ の間である必要があります。そうでない場合、c は文字「c」そのものであるとみなされます。 |
d | 数値文字のマッチング。 [0-9]に相当します。 |
D | 数字以外の文字と一致します。 [^0-9] と同等。 |
f | フォーム フィードが一致します。 x0c および cL に相当します。 |
n | 改行一致。 x0a および cJ に相当します。 |
r | 復帰文字と一致します。 x0d および cM に相当します。 |
s | スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 [fnrtv] と同等。 |
S | 空白以外の任意の文字と一致します。 [^fnrtv] と同等。 |
t | タブマッチング。 x09 および cI に相当します。 |
v | 垂直タブのマッチング。 x0b および cK に相当します。 |
w | アンダースコアを含む任意の文字型に一致します。 「[A-Za-z0-9_]」に相当します。 |
W | 単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。 |
xn | nと一致します。ここで、 nは 16 進数のエスケープ コードです。 16 進数のエスケープ コードは、正確に 2 桁の長さである必要があります。たとえば、「x41」は「A」と一致します。 「x041」は「x04」&「1」と同等です。正規表現で ASCII コードを許可します。 |
番号 | numと一致します。ここで、 numは正の整数です。一致をキャプチャするための後方参照。たとえば、「(.)1」は、連続する 2 つの同一の文字と一致します。 |
n | 8 進数のエスケープ コードまたは後方参照を識別します。 n の前に少なくともn 個のキャプチャ部分式がある場合、 n は後方参照になります。それ以外の場合、 nが 8 進数 (0 ~ 7) の場合、 n は8 進数のエスケープ コードになります。 |
nm | 8 進数のエスケープ コードまたは後方参照を識別します。 nm の前に少なくともnm のキャプチャ部分式がある場合、 nm は後方参照です。 nm の前に少なくともn 個のキャプチャがある場合、 n は後方参照であり、その後に文字mが続きます。前の条件がどちらも存在しない場合、 nm は8 進値nmと一致します。ここで、 nとmは 8 進数 (0 ~ 7) です。 |
nml | nが 8 進数 (0 ~ 3)、 mとlが 8 進数 (0 ~ 7) の場合、8 進数のエスケープ コードnmlと一致します。 |
u n | nと一致します。ここで、 nは 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (©) に一致します。 |
Index メソッドは、入力文字列内の一致が見つかった場所を正確に示す便利なインデックス値を提供します。
シリアルナンバー | 方法と手順 |
---|---|
1 | public int start() は、前の一致の初期インデックスを返します。 |
2 | public int start(int group)前回のマッチング操作中に指定されたグループによってキャプチャされたサブシーケンスの初期インデックスを返します。 |
3 | public int end() は、最後に一致した文字の後のオフセットを返します。 |
4 | public int end(int group)前回の照合操作中に指定されたグループによってキャプチャされたサブシーケンスの最後の文字の後のオフセットを返します。 |
Research メソッドは入力文字列を検査し、パターンが見つかったかどうかを示すブール値を返します。
シリアルナンバー | 方法と手順 |
---|---|
1 | public boolean lookingAt() は、範囲の先頭から始まる入力シーケンスをこのパターンと照合しようとします。 |
2 | public boolean find() は、このパターンに一致する入力シーケンスの次のサブシーケンスを検索しようとします。 |
3 | public boolean find(int start)このマッチャーをリセットし、このパターンに一致する、指定されたインデックスから始まる入力シーケンスの次のサブシーケンスの検索を試みます。 |
4 | public booleanmatchs() は、範囲全体をパターンと照合しようとします。 |
置換メソッドは、入力文字列内のテキストを置換するメソッドです。
シリアルナンバー | 方法と指示 |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replace) は、非終端の追加および置換ステップを実装します。 |
2 | public StringBuffer appendTail(StringBuffer sb) は、端末の追加および置換の手順を実装します。 |
3 | public String replaceAll(String replace)指定された置換文字列とパターンが一致する入力シーケンスのすべてのサブシーケンスを置換します。 |
4 | public String replaceFirst(String replace)指定された置換文字列とパターンが一致する入力シーケンスの最初のサブシーケンスを置換します。 |
5 | public static String quoteReplacement(String s) は、指定された文字列のリテラル置換文字列を返します。このメソッドは、Matcher クラスの appendReplacement メソッドに渡されるリテラル文字列と同様に機能する文字列を返します。 |
以下は、入力文字列内の単語「cat」の出現数をカウントする例です。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス RegexMatches
{
プライベート静的最終文字列REGEX = "\bcat\b";
プライベート静的最終文字列 INPUT =
「猫猫猫猫猫」。
public static void main( String args[] ){
パターン p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // matcher オブジェクトを取得 int count = 0;
while(m.find()) {
カウント++;
System.out.println("一致する番号 "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
上記の例のコンパイルと実行結果は次のとおりです。
一致番号 1
開始(): 0
終了(): 3
マッチ番号 2
開始(): 4
終了(): 7
一致番号 3
開始(): 8
終了(): 11
試合番号 4
開始(): 19
終了(): 22
この例では、単語境界を使用して、文字「c」「a」「t」が長い単語の単なる部分文字列ではないことを確認していることがわかります。また、入力文字列内の一致が発生した場所に関するいくつかの有用な情報も提供します。
start メソッドは、前の一致操作中に指定されたグループによってキャプチャされたサブシーケンスの初期インデックスを返し、end メソッドは最後に一致した文字のインデックスに 1 を追加します。
matches メソッドと lookingAt メソッドはどちらも、入力シーケンス パターンの一致を試みるために使用されます。それらの違いは、match ではシーケンス全体が一致する必要があるのに対し、lookAt ではその必要がないことです。
これら 2 つのメソッドは、入力文字列の先頭でよく使用されます。
この関数を説明するために次の例を使用します。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス RegexMatches
{
プライベート静的最終文字列REGEX = "foo";
プライベート静的最終文字列 INPUT = "fooooooooooooooooo";
プライベート静的パターンパターン。
プライベート静的 Matcher マッチャー。
public static void main( String args[] ){
パターン = パターン.コンパイル(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("現在の正規表現は: "+REGEX);
System.out.println("現在の入力は: "+INPUT);
System.out.println("lookAt(): "+matcher.lookAt());
System.out.println("matches(): "+matcher.matches());
}
}
上記の例のコンパイルと実行結果は次のとおりです。
現在の正規表現は次のとおりです: foo
現在の入力は: fooooooooooooooooo
探している(): true
一致(): false
replaceFirst メソッドと replaceAll メソッドは、正規表現に一致するテキストを置換するために使用されます。違いは、replaceFirst は最初の一致を置き換えるのに対し、replaceAll はすべての一致を置き換えることです。
次の例は、この機能を説明しています。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス RegexMatches
{
プライベート静的文字列REGEX = "犬";
private static String INPUT = "犬がニャーと言う。" +
「犬はみんなニャーと鳴きます。」
プライベート静的文字列 REPLACE = "猫";
public static void main(String[] args) {
パターン p = Pattern.compile(REGEX);
//マッチャーオブジェクトを取得する
マッチャー m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
上記の例のコンパイルと実行結果は次のとおりです。
猫は「ニャー」と言います。
Matcher クラスは、テキスト置換のための appendReplacement メソッドと appendTail メソッドも提供します。
この機能を説明するには、次の例を見てください。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス RegexMatches
{
プライベート静的文字列REGEX = "a*b";
プライベート静的文字列 INPUT = "aabfooaabfooabfoob";
プライベート静的文字列 REPLACE = "-";
public static void main(String[] args) {
パターン p = Pattern.compile(REGEX);
// マッチャー オブジェクトを取得します Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
上記の例のコンパイルと実行結果は次のとおりです。
-フーフーフー-
PatternSyntaxException は、正規表現パターンの構文エラーを示す非強制例外クラスです。
PatternSyntaxException クラスは、どのようなエラーが発生したかを確認するのに役立つ次のメソッドを提供します。
シリアルナンバー | 方法と手順 |
---|---|
1 | public String getDescription()エラーの説明を取得します。 |
2 | public int getIndex() は間違ったインデックスを取得します。 |
3 | public String getPattern() は間違った正規表現パターンを取得します。 |
4 | public String getMessage() は、構文エラーの説明とそのインデックス、エラーの正規表現パターン、およびパターン内のエラーのインデックスの視覚的な表示を含む複数行の文字列を返します。 |