目次
プログラム開発の過程で、当社が共通に登録するメールアドレスや携帯電話番号などの一部の文字列には、一般的に長さや形式に制限を設けるなど、さまざまな制限を設けております。これらの制限的な操作は正規表現を使用して行われます。いわゆる正規表現は、特定の文法規則を満たす一連の文字列を説明または一致させるために使用される単一の文字列を指します。実際、それはルールです。
正規表現は、ターゲット オブジェクト内の通常の文字 (文字 az など) と特殊文字 (メタキャラクター (メタキャラクターの前の文字) の出現パターンで構成されるテキスト パターンです。
一般的なメタキャラクターは次のとおりです
メタキャラクター |
機能説明 |
\ |
エスケープ文字。たとえば、「\n」は「\n」と一致します。 |
^ |
正規表現の開始フラグ |
$ |
正規表現の終わり |
* |
0 回以上一致します |
+ |
1 回以上一致する |
? |
1 回または 0 回一致する |
。 |
どの文字にも一致します |
{n} |
n回一致 |
{n,} |
少なくともn回一致 |
{n,m} |
n<=m、少なくともn回一致、最大m回一致 |
x|y| |
xまたはyと一致する |
[xyz] |
キャラクターのコレクション。に含まれる文字のいずれかと一致します |
[az] |
小文字の a ~ z の任意の文字と一致します。 |
|
A から Z までの大文字のいずれかと一致します。 |
メタキャラクター |
機能説明 |
[a- zA -Z] |
大文字または小文字の任意のアルファベットの任意の 1 文字と一致します。 |
[アズ] |
別の書き方では、大文字または小文字のアルファベットの任意の文字に一致します。 |
\d |
数字: [0-9] |
\D |
数字ではありません: [^0-9] |
\s |
空白文字: [ \t\n\x0B\f\r] |
\S |
空白以外の文字: [^\s] |
\w |
単語文字: [a-zA-Z_0-9] |
\b |
単語の境界 |
\B |
非単語境界 |
\A |
入力の開始 |
\G |
前の試合の終わり |
\Z |
入力の終わり、最後のターミネータ (存在する場合) のみ |
\z |
入力の終わり |
\b |
単語の境界 |
Java の正規表現は Perl の構文に非常に似ています。Java では、java.util.regex パッケージを使用して、主に Pattern、Matcher、および PatternSyntaxException の 3 つのクラスに関係する正規表現を処理します。
- Pattern クラスは正規表現のコンパイルされた表現であり、パブリック コンストラクターはありません。Pattern オブジェクトを作成するには、引数として正規表現を受け入れるパブリック静的コンパイル メソッドを呼び出します。
- Matcher クラスは、入力文字列に対する操作を解釈して照合するためのエンジンであり、パブリック コンストラクターはありません。Matcher オブジェクトは、Pattern オブジェクトの matcher メソッドを呼び出すことで取得でき、そのオブジェクトを文字列一致操作に使用できます。
- PatternSyntaxException クラスは、正規表現パターンの構文エラーを示すために使用される非必須の例外クラスです。
パターンクラス
Pattern クラスは、正規表現のコンパイルされた表現を表すために使用される Java のクラスです。正規表現を作成、照合、操作するための一連のメソッドと関数を提供します。
Pattern クラスを使用するには、その静的メソッド apply を呼び出して正規表現をコンパイルし、それを Pattern オブジェクトに変換する必要があります。一般的に使用されるいくつかの方法を次に示します。
- compile(String regex): 静的メソッド。指定された正規表現を Pattern オブジェクトにコンパイルします。
- Matcher matcher(CharSequence input): 入力文字列と一致する新しい Matcher オブジェクトを返します。
- pattern(): 現在の Pattern オブジェクトによって表される正規表現を返します。
- split(CharSequence input): 現在の正規表現に従って、入力文字列を複数の文字列配列に分割します。
- 静的ブール一致 (String regex, CharSequence input): 入力シーケンス全体を正規表現と照合しようとし、照合結果が成功したかどうかを示すブール値を返します。
上記のメソッドに加えて、Pattern クラスは、正規表現の一致と置換のための他の多くのメソッドも提供します。
マッチャークラス
Matcher クラスは、文字列に対して正規表現の一致操作を実行するために Java で使用されるクラスです。これは、Pattern クラスのインスタンス化されたオブジェクトであり、照合操作を実行するための一連のメソッドと関数を提供します。
Matcher クラスを使用するには、まず Matcher オブジェクトを作成する必要があります。Matcher オブジェクトを作成するには、Pattern クラスの matcher(CharSequence input) メソッドを呼び出し、照合する文字シーケンスをパラメータとして渡します。
Matcher クラスの一般的なメソッドをいくつか示します。
- booleanmatches (): 入力シーケンス全体を正規表現と照合しようとし、照合が成功したかどうかを示すブール値を返します。
- boolean lookingAt():前の文字列と一致し、一致した文字列が先頭にある場合にのみ true を返します。
- boolean find(): 入力シーケンス内の次の一致を検索し、一致が見つかったかどうかを示すブール値を返します。
- String group(): 最後に一致した操作によって一致したサブシーケンスを返します。
- int start(): 最後の一致の開始インデックス位置を返します。
- int end(): 最後に一致した操作の終了インデックスの後の位置を返します。
- replaceAll(文字列置換): 正規表現に一致する入力文字列のすべての部分を指定された文字列に置き換えます。
- replaceFirst(文字列置換): 正規表現に一致する入力文字列の最初の部分を指定された文字列に置き換えます。
- reset(CharSequence input): Matcher オブジェクトをリセットし、照合用の新しい入力シーケンスを指定します。
例
以下は、正規表現の照合と操作に と クラスPattern
を使用する方法を示す例です。Matcher
import java.util.regex.*;
public class myclass {
public static void main(String[] args) {
String input = "请联系我邮箱: [email protected] 或者访问我的网站 https://www.example.com 获取更多信息。";
// 定义正则表达式
String emailPatternString = "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b";
String urlPatternString = "https?://[\\w.-]+\\.[A-Za-z]{2,}";
// 创建 Pattern 对象
Pattern emailPattern = Pattern.compile(emailPatternString);
Pattern urlPattern = Pattern.compile(urlPatternString);
// 创建 Matcher 对象
Matcher emailMatcher = emailPattern.matcher(input);
Matcher urlMatcher = urlPattern.matcher(input);
// 查找并输出第一个匹配的邮箱地址
if (emailMatcher.find()) {
String matchedEmail = emailMatcher.group();
System.out.println("匹配到的邮箱地址: " + matchedEmail);
}
// 判断输入中是否包含 URL
boolean containsUrl = urlMatcher.find();
System.out.println("输入中是否包含 URL: " + containsUrl);
// 循环查找并输出所有匹配的 URL
int count = 0;
while (urlMatcher.find()) {
count++;
String matchedUrl = urlMatcher.group();
System.out.println("匹配到的 URL " + count + ": " + matchedUrl);
}
// 替换邮箱地址和网址
String modifiedInput = emailMatcher.replaceAll("[email protected]");
String modifiedInput1 = urlMatcher.replaceAll("https://www.abc.com");
System.out.println("------------------");
System.out.println("修改后的输入: " + modifiedInput);
System.out.println("修改后的输入: " + modifiedInput1);
}
}
操作結果:
匹配到的邮箱地址: [email protected]
输入中是否包含 URL: true
------------------
修改后的输入: 请联系我邮箱: [email protected] 或者访问我的网站 https://www.example.com 获取更多信息。
修改后的输入: 请联系我邮箱: [email protected] 或者访问我的网站 https://www.abc.com 获取更多信息。
PatternSyntaxException クラス
PatternSyntaxException は、正規表現の解析中に見つかった構文エラーを示すために使用される Java の例外クラスです。
このクラスは java.util.regex パッケージで定義され、RuntimeException クラスから拡張されます。開発者が問題をデバッグおよび修正するのに役立つ正規表現構文エラーに関する詳細情報を提供します。
PatternSyntaxException クラスには、次の重要なプロパティとメソッドがあります。
- String getDescription(): 構文エラーに関する説明情報を取得します。
- int getIndex(): 構文エラーが発生した位置のインデックスを取得します。
- String getMessage(): 説明とインデックスを含む完全なエラー メッセージを取得します。
- String getPattern(): 構文エラーを引き起こした正規表現パターンを取得します。
- String getMessage(Locale locale): 指定されたロケールのエラー メッセージを取得します。
cancel() または Pattern クラスのその他の関連メソッドを使用して正規表現をコンパイルまたは解析するときに、構文エラーが見つかると、PatternSyntaxException がスローされます。
例
以下は、PatternSyntaxException 例外クラスを使用して例外条件を処理する方法を示すサンプル コードです。
import java.util.regex.*;
public class myclass {
public static void main(String[] args) {
String invalidPattern = "*abc";
try {
Pattern.compile(invalidPattern);//当*abc妀为^abc执行
} catch (PatternSyntaxException e) {
System.out.println("正则表达式语法错误: " + e.getDescription());
System.out.println("错误位置索引: " + e.getIndex());
System.out.println("错误消息: " + e.getMessage());
System.out.println("错误模式: " + e.getPattern());
}
}
}
上の例では、構文エラーを含む正規表現「*abc」をコンパイルしようとしています。パターンが正しくない場合は、PatternSyntaxException がスローされます。この状況は、例外をキャッチして関連情報を出力することで処理されます。
正则表达式语法错误: Dangling meta character '*'
错误位置索引: 0
错误消息: Dangling meta character '*' near index 0
*abc
^
错误模式: *abc