正規表現を使用したJavaの正規表現
正規表現は、文字のシーケンス内のパターンを記述する文字列です。You can use the API 正規表現 for:
- 電子メールやパスワードの有効性など、文字のシーケンスを検証します。
- 検索 糸;
- String のパターンまたは文字セットを置換します。
API java.util.regex には 1 つのインタフェースと 3 つのクラスがあります:
- <>
- Pattern class: 正規表現のコンパイル済み表現。パターンを作成するには、そのメソッドの 1 つを呼び出す必要があります public static compile, これはPatternオブジェクトを返します。これらのメソッドは、正規表現を引数として受け入れます.
- Matcher class: 文字列を解析するパターン検索エンジン。Matcher オブジェクトを取得するには、Pattern オブジェクトの Matcher メソッドを呼び出します。これら 2 つのクラスは連携して動作します.
- PatternSyntaxException: 正規表現が無効な場合に例外をスローします.
Matcher class
The methods of the Matcher:
No. | メソッド | Description |
---|---|---|
1 | boolean matches() | 文字列がパターンをチェックする場合にtrueを返します |
2 | boolean find() | パターンをチェックする次の式を検索します |
3 | boolean find(int start) | 開始インデックスからパターンをチェックする次の式を検索します |
Pattern class
これは正規表現のコンパイル済みバージョンです。パターンまたは正規表現に使用されます.
No. | メソッド | Description |
---|---|---|
1 | static パターン compile(String regex) | 正規表現をコンパイルし、Pattern |
2 | Matcher matcher(CharSequence input) | 入力シーケンスを解析するマッチャーを作成します |
3 | static boolean matches(String regex, CharSequence input) | 入力シーケンスをコンパイルして解析します。 |
4 | String[] split(CharSequence c) | 文字 c |
5 | 文字列 pattern() | 正規表現文字列を返します。 |
Example
import java.util.regex.*;
public class regexTest {
public static void main(String args[]) {
パターン p;
Matcher m;
//パターンによる正規表現のコンパイル: "a"
p = Pattern.compile("a");
//エンジンを作成し、文字列 "ab"
m = p.matcher("ab");
//パターンが見つかった場合
if(m.find()) {
System.out.println("pattern found");
}
}
}
pattern found
正規表現の構文
1- メタ文字
メタ文字は、意味を持つ文字、またはその他の方法を持つ文字です。 パターンの構築方法。たとえば、メタ文字の前に文字 の場合、パーサーによって解釈されません。Java 正規表現でサポートされているメタ文字は、次の表のとおりです:Character | Description |
---|---|
[ ] | |
{ } | Quantizer |
\ | 文字はメタキャラクタとは見なされません |
^ | 行頭 |
$ | Endline |
| | Operator OU |
? | 0 または直前の式 |
* | 0 または直前の式を複数回 |
+ | 前の式の 1 倍以上 |
. | 任意の文字を置き換えます |
例:
import java.util.regex.Matcher;The matches()は Matcher と Pattern クラスに属しており、true 探しているパターンが文字列に存在する場合.
import java.util.regex.Pattern;
public class metaCharactersExample: {
public static void main(String[] args) {
System.out.println(
Pattern.matches(".c", "abc"));//false (. は a のみを置き換えます)
System.out.println(
Pattern.matches("..c", "abc"));//true (3 文字目は c)
System.out.println(
Pattern.matches("...c", "abbc"));//true (4 文字目は c)
System.out.println(Pattern.matches("\\d", "2"));//true (1 桁のみ)
System.out.println(Pattern.matches("\\d", "332"));//false (複数桁)
System.out.println(Pattern.matches(
"\\d","123abc"));//false (数字と文字)
System.out.println(Pattern.matches(
"\\D*", "geek"));//true (暗号化されておらず、少なくとも1回は出現)
}
}
2- 文字クラス
文字クラスは文字のセットです。メタ文字 [...] は、正規表現内の文字クラスを意味します。範囲はハイフン '-' です。たとえば[0-9] は 0 から 9.[abc] | a、b、またはc |
---|---|
[^abc] | 否定: a,b と c |
[a-zA-Z] | 範囲: a から z および A から Z までのすべての文字を置換します |
[a-d[m-p]] | Union: a から d または m から p の文字を置換します: [a-dm-p] |
[a-z&&[ABCの]] | Intersection: a、b、c の交点全体を a から z までの文字に置き換えます |
[a-z&&[^cd]] | 減算: a から z までの c と d を除くすべての文字を置換します: [abe-z] |
[a-z&&[^m-p]] | 減算: m から p を除く a から z へ: [a-lq-z] |
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class metaFeaturesExample: {
public static void main(String[] args) {
Pattern p;
Matcher m;
//345
を除く0から9までのすべての数字 p = Pattern.compile("[0-9&&[^345]]");
m = p.matcher("7");
boolean b = m.matches();
System.out.println(b);
}
}
true
定義済み文字クラス
これらはJava:Class | 説明 |
---|---|
. | 任意の文字 |
\d | 1つの数字: [0-9] |
\D | |
\s | 空白文字: 改行、スペース: [ \t\n\x0B\f\r] |
\S | 白以外の文字: [^\s] |
\w | 単語文字: [a-zA-Z_0-9] |
\W | 単語ではない文字: [^\w] |
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CharacterClassesExample{
public static void main(String args[]) {
//d: 1 桁
//+: 1 桁以上
String regex = "\\d+";
パターン p = Pattern.compile(regex);
文字列フレーズ = "2015 21年";
マッチャー m = p.matcher(sentence);
if (m.find()) {
//最初のグループを表示
System.out.println("group 0:" + m.group(0));
}
}
}
group 0:2015この例では、正規表現 "\\d+" には 2 つのスラッシュが含まれていますが、これは Java では常に '\ 前。\d は 0 から 9 の範囲を意味します '+ 、見つかった最初の桁のみが考慮されます: 2.
3- 量指定子
クオンタイザーを使用すると、文字が繰り返される回数を設定できます.クオンタイザ | 説明 |
---|---|
X? | X は複数回出現しません |
X+ | 1回以上 |
X* | 0回または複数回 |
X{n} | n times |
X{n,} | n回または複数回 |
X{y,z} | 少なくともy回、z倍未満 |
Examples
Motif | String | Results |
---|---|---|
[abc]? | a | a |
[abc]? | aa | none |
[ABC]? | ab | none |
A? | abdaaaba | {a},{ },{ },{a},{a},{a},{ },{a} |
a* | abdaaaba | {a},{ },{ },{ },{a},{a} |
a+ | abdaaaba | {a},{aaa},{a} |
a[3] | aaaa | aaa |
a{3, 6} | aaaaaaaa | aaaaaa |
[0-9]{4} | 2038年のバグは2000年のバグに似ています | {2038}, {2000} |
4- キャプチャ グループ
キャプチャ グループを使用すると、複数の文字を処理できますを 1 つの単位またはサブパターンとして記述します。たとえば、(abc) は、"a", "b", "c".キャッチグループは、左から右に開く括弧の数でカウントされます。式 (A(B(C)))、4つのグループがあります。グループ 0 には、常に式全体が含まれます:
- グループ0:(A(B(C))))
- グループ1: (A)
- グループ2: (B(C))
- グループ3: (C)
グループによってキャプチャされた部分文字列は、group(int).
例1:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Goup {
public static void main(String[] args) {
Pattern p = Pattern.compile("(A(B(C)))");
マッチャー m = p.matcher("ABC");
if( m.matches()))
for(int i= 0; i<= m.groupCount(); ++i)
System.out.println("group "+i+" :"+m.group(i));
}
}
group 0:ABC例 2
group 1:ABC
group 2:BC
group 3:C
このプログラムは、電話番号の有効性を読み取ってチェックする正規表現を作成します。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex_telephone {
public static void main(String[] args) {
String regex = "\\b(\\d{3})(\\d{4})(\\d{3})(\\d{3})\\b";
パターン p = Pattern.compile(regex);
文字列tel = "2541724156348";
Matcher m = p.matcher(tel);
if (m.find()) {
System.out.println("電話: ("
+ m.group(1) + ") " + m.group(2) + "-"
+ m.group(3) + "-" + m.group(4));
}
}
}
電話: (254) 1724-156-348
5- 検索境界
探しているパターンの場所と開始位置を指定することで、パターンをより正確にすることができます。limiter | Description |
---|---|
^ | 行頭 |
$ | Endline |
\b | |
\B | 非単語終了. |
\A | 入力シーケンス開始 |
\G | 前のオカレンスの終了 |
\Z | 最後の文字を除くシーケンスの終わり |
\z | シーケンスの終わり |
Examples
Motif | String | Results |
---|---|---|
^java$ | java | java |
\s*java$ | java | java |
^hello\w* | helloblahblah | helloblahblah |
\bjava\B | javascriptはプログラミング言語です | java |
\Gtest | test test | test |
\btest\b | これはtest | test |
パターンを見つけて置き換える
Regex API を使用すると、1 つのテキストを見つけて別のテキストに置き換えることができます。Java では、Matcher クラスの 2 つのメソッドを使用してこのタスクを実行できます:- replaceFirst(String): 最初の出現箇所のみを置換します。
- replaceAll(String): すべての出現箇所を反復して置換します。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Replacement {
public static void main(String[] args) {
Pattern p = Pattern.compile("bus");
Matcher m = p.matcher("バスで移動中");
文字列 s = m.replaceAll("train");
System.out.println(秒);
}
}
電車で旅行していますReferences:
Java Doc: 正規表現
JavaPoint: Java Regex
TutorialsPoint: Java - 正規表現
Expand: Java