Javaの正規表現
正規表現は文字列のパターンを定義します。
正規表現はテキストの検索、編集、処理に使用できます。
正規表現は 1 つの言語に限定されるわけではなく、言語ごとに微妙な違いがあります。
Java の正規表現は Perl の正規表現に最も似ています。
java.util.regex パッケージには主に次の 3 つのクラスが含まれています:
Pattern クラス:
pattern オブジェクトは正規表現のコンパイルされた表現です。パターン クラスにはパブリック コンストラクターがありません。 Pattern オブジェクトを作成するには、まずそのパブリック静的コンパイル メソッドを呼び出す必要があります。このメソッドは Pattern オブジェクトを返します。このメソッドは、最初のパラメータとして正規表現を受け入れます。
Matcher クラス:
Matcher オブジェクトは、入力文字列を解釈して照合するエンジンです。 Pattern クラスと同様に、Matcher にはパブリック コンストラクターがありません。 Matcher オブジェクトを取得するには、Pattern オブジェクトの matcher メソッドを呼び出す必要があります。
PatternSyntaxException:
PatternSyntaxException は、正規表現パターンの構文エラーを表す非必須の例外クラスです。
キャプチャグループ
キャプチャグループとは、複数の文字を括弧内でグループ化して作成する方法です。
たとえば、正規表現 (dog) は、「d」、「o」、「g」を含む 1 つのグループを作成します。
キャプチャ グループには、左かっこを左から右に数えることによって番号が付けられます。たとえば、式 ((A)(B(C))) には、そのようなグループが 4 つあります:
((A)(B(C)))
(A)
(B(C))
(C)
matcher オブジェクトの groupCount メソッドを呼び出すことで、式に含まれるグループの数を確認できます。 groupCount メソッドは int 値を返し、マッチャー オブジェクトに現在複数のキャプチャ グループがあることを示します。
常に式全体を表す特別なグループ (グループ 0) もあります。 groupCountの戻り値にはグループは含まれません。
例
次の例は、指定された文字列から数値文字列を検索する方法を示しています:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ){ // 按指定模式在字符串查找 String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\d+)(.*)"; // 创建 Pattern 对象 Pattern r = Pattern.compile(pattern); // 现在创建 matcher 对象 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"); } } }
上記の例は、次のように結果をコンパイルして実行します:
Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT300 Found value: 0
正規表現構文
文字 | 説明 |
---|---|
次の文字を特殊文字、テキスト、後方参照、または 8 進エスケープとしてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス "\"matches"","("matches"("。 | |
^ | は入力文字列の先頭と一致します。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]」などのパターンを使用します。 |
(pattern) | はpatternと一致し、一致した部分式をキャプチャします。キャプチャされた一致は、$0…$9 属性を使用して、結果の「一致」コレクションから取得できます。括弧文字 ( ) と一致させるには、「(」または「)」を使用します。 |
(?:パターン) | は pattern に一致しますが、その一致の部分式をキャプチャしません。つまり、非キャプチャ一致であり、後で使用するために一致を保存しません。これは、パターン部分を「または」文字 (|) と組み合わせるときに便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも経済的な表現です。 |
(?=pattern) | pattern に一致する文字列の先頭にある文字列と一致する前方検索を実行する部分式。これは非キャプチャ一致、つまり、後で使用するためにキャプチャできない一致です。たとえば、「Windows (?=95|98|NT|2000)」は、「Windows 2000」の「Windows」には一致しますが、「Windows 3.1」の「Windows」には一致しません。予測先読みは文字を占有しません。つまり、一致が発生した後、予測先読みを構成する文字の後ではなく、前の一致の直後に次の一致が検索されます。 |
(?!pattern) | 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」に一致します。 |
[a-z] | 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は「a」から「z」の範囲内の任意の小文字と一致します。 |
[^a-z] | 逆範囲文字。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は「a」から「z」の範囲にない任意の文字に一致します。 |
b | は、単語の境界、つまり単語とスペースの間の位置に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。 |
B | 非単語境界のマッチング。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。 |
cx | は、xで示される制御文字と一致します。たとえば、cM は Control-M またはキャリッジ リターンと一致します。 x の値は、A ~ Z または a ~ z の間である必要があります。そうでない場合、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と一致します。ここで、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と一致します。 。 |
うん | は n と一致します。ここで、n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (©) に一致します。 |
Matcher クラスのメソッド
Index メソッド
index メソッドは、入力文字列内の一致が見つかった場所を正確に示す便利なインデックス値を提供します:
シリアル番号 | 方法と説明 |
---|---|
1 | public int start() 前の一致の初期インデックスを返します。 |
2 | public int start(intグループ) 前回のマッチング操作中に指定されたグループによってキャプチャされたサブシーケンスの初期インデックスを返します |
3 | public int end() 最後に一致した文字の後のオフセットを返します。 |
4 | public int end(intグループ) 前回の照合操作中に指定されたグループによってキャプチャされたサブシーケンスの最後の文字の後のオフセットを返します。 |
リサーチメソッド
リサーチメソッドは、入力文字列をチェックし、パターンが見つかったかどうかを示すブール値を返すために使用されます:
シリアル番号 | メソッドと説明 |
---|---|
1 | public boolean lookingAt() 領域の先頭から始まる入力シーケンスをこのパターンに一致させようとします。 |
2 | public boolean find() このパターンに一致する入力シーケンスの次のサブシーケンスを検索してみてください。 |
3 | public boolean find(int start) このマッチャーをリセットし、パターンに一致する、指定されたインデックスから始まる入力シーケンスの次のサブシーケンスの検索を試みます。 |
4 | パブリックブール一致() エリア全体をパターンに合わせてみてください。 |
public Matcher appendReplacement(StringBuffer sb, String replace)
2 | public StringBuffer appendTail(StringBuffer sb) 端末の追加・交換手順を実施します。 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
3 | public String replaceAll(文字列置換) 指定された置換文字列と一致する入力シーケンスの各サブシーケンスの置換パターン。 | |||||||||
4 | public String replaceFirst(文字列置換) 置換パターンは、入力シーケンスの最初のサブシーケンスを指定された置換文字列と照合します。 | |||||||||
5 | public static String quoteReplacement(String s) 指定された文字列のリテラル置換文字列を返します。このメソッドは、Matcher クラスの appendReplacement メソッドに渡されるリテラル文字列と同様に機能する文字列を返します。 | |||||||||
開始メソッドと終了メソッド以下は、入力文字列に単語「cat」が出現する回数をカウントする例です: 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); // 获取 matcher 对象 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()); } } } 上記の例のコンパイルと実行結果は次のとおりです: 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 を追加します。 matches メソッドと LookingAt メソッドmatches メソッドと LookingAt メソッドは両方とも、入力シーケンス パターンの一致を試みるために使用されます。両者の違いは、matcher ではシーケンス全体が一致する必要があるのに対し、lookAt ではその必要がないことです。 これら 2 つのメソッドは、入力文字列の先頭でよく使用されます。 この関数を説明するために次の例を使用します: 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()); } } 上記の例のコンパイル結果と実行結果は次のとおりです: Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false replaceFirst メソッドと replaceAll メソッドreplaceFirst メソッドと replaceAll メソッドは、正規表現に一致するテキストを置換するために使用されます。 。違いは、replaceFirst は最初の一致を置き換えるのに対し、replaceAll はすべての一致を置き換えることです。 次の例は、この関数を説明しています: 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); } } 上記の例のコンパイル結果と実行結果は次のとおりです: The cat says meow. All cats say meow. appendReplacement メソッドと appendTail メソッドMatcher クラスは、テキスト置換のための appendReplacement メソッドと appendTail メソッドも提供します: Look以下の例でこの関数について説明します: 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); // 获取 matcher 对象 Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb,REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } } 上記の例のコンパイル結果と実行結果は次のとおりです: -foo-foo-foo- PatternSyntaxException クラスのメソッドPatternSyntaxException は、通常の構文エラーを示す非必須の例外クラスです。表現パターン。 PatternSyntaxException クラスは、どのようなエラーが発生したかを確認するのに役立つ次のメソッドを提供します。
|