java.util.regex パッケージ ↑
javaはバージョン1.4から正規表現をサポートしています。
メタ文字 ↑
文字の表現 ↑
構文
|
マッチ対象
|
x
|
文字 x
|
\\
|
バックスラッシュ文字
|
\0n
|
8進値 0n を持つ文字 (0 <= n <= 7)
|
\0nn
|
8進値 0nn を持つ文字 (0 <= n <= 7)
|
\0mnn
|
8進値 0mnn を持つ文字 (0 <= m <= 3、0 <= n <= 7)
|
\xhh
|
16進値 0xhh を持つ文字
|
\uhhhh
|
16進値 0xhhhh を持つUnicode文字
|
\t
|
タブ文字 ('\u0009')
|
\n
|
改行文字 ('\u000A')
|
\r
|
キャリッジリターン文字 ('\u000D')
|
\f
|
用紙送り文字 ('\u000C')
|
\a
|
警告 (ベル) 文字 ('\u0007')
|
\e
|
エスケープ文字 ('\u001B')
|
\cx
|
x に対応する制御文字
|
文字クラスと定義済み文字クラス ↑
構文
|
マッチ対象
|
[abc]
|
a、b、または c (単純クラス)
|
[^abc]
|
a、b、c 以外の文字 (否定)
|
[a-zA-Z]
|
a 〜 z または A 〜 Z (範囲)
|
[a-d[m-p]]
|
a 〜 d、または m 〜 p: [a-dm-p] (結合)
|
[a-z&&[def]]
|
d、e、f (交差)
|
[a-z&&[^bc]]
|
b と c を除く a 〜 z: [ad-z] (減算)
|
[a-z&&[^m-p]]
|
m 〜 p を除く a 〜 z: [a-lq-z] (減算)
|
.
|
任意の文字 (行末記号とマッチする場合もある)
|
\d
|
数字: [0-9]
|
\D
|
数字以外: [^0-9]
|
\s
|
空白文字: [ \t\n\x0B\f\r]
|
\S
|
非空白文字: [^\s]
|
\w
|
単語構成文字: [a-zA-Z_0-9] 多バイト文字に対応した正規表現では、日本語のいわゆる全角文字(ひらがな・カタカナ・漢字・全角記号)にもマッチ。
|
\W
|
非単語文字: [^\w]
|
\p{prop}
|
POSIX文字クラス、Unicodeのプロパティ、スクリプト、ブロックに属する文字
|
\P{prop}
|
POSIX文字クラス、Unicodeのプロパティ、スクリプト、ブロックに属さない文字(否定)
|
POSIX 文字クラス ↑
構文
|
マッチ対象
|
\p{Lower}
|
小文字の英字: [a-z]
|
\p{Upper}
|
大文字の英字: [A-Z]
|
\p{ASCII}
|
すべての ASCII 文字: [\x00-\x7F]
|
\p{Alpha}
|
英字: [\p{Lower}\p{Upper}]
|
\p{Digit}
|
10 進数字: [0-9]
|
\p{Alnum}
|
英数字: [\p{Alpha}\p{Digit}]
|
\p{Punct}
|
句読文字: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のいずれか
|
\p{Graph}
|
表示できる文字: [\p{Alnum}\p{Punct}]
|
\p{Print}
|
プリント可能文字: [\p{Graph}]
|
\p{Blank}
|
空白またはタブ: [ \t]
|
\p{Cntrl}
|
制御文字: [\x00-\x1F\x7F]
|
\p{XDigit}
|
16 進数字: [0-9a-fA-F]
|
\p{Space}
|
空白文字: [ \t\n\x0B\f\r]
|
Unicode ブロックとカテゴリのクラス ↑
構文
|
マッチ対象
|
\p{Sc}
|
通貨記号
|
\p{InBasicLatin?}
|
ASCIIブロックの文字
|
\p{InHiragana?}
|
ひらがなブロックの文字
|
\p{InKatakana?}
|
カタカナブロックの文字
|
\p{InCJKUnifiedIdeographs?}
|
漢字ブロックの文字
|
境界正規表現エンジン ↑
構文
|
マッチ対象
|
^
|
行の先頭
|
$
|
行の末尾
|
\b
|
単語境界
|
\B
|
非単語境界
|
\A
|
入力の先頭
|
\G
|
前回のマッチの末尾
|
\Z
|
最後の行末記号がある場合は、それを除く入力の末尾
|
\z
|
入力の末尾
|
グループ化、キャプチャ、条件式、制御式 ↑
構文
|
マッチ対象
|
(X)
|
X、前方参照を行う正規表現グループ
|
\n
|
マッチした n 番目の前方参照を行う正規表現グループ
|
(?:X)
|
X、前方参照を行わない正規表現グループ
|
(?idmsux-idmsux)
|
正規表現ではないが、マッチフラグのオン/オフを切り替える
|
(?idmsux-idmsux:X)
|
X、指定されたフラグをオン/オフにした前方参照を行わない正規表現グループ
|
(?=X)
|
X、幅ゼロの肯定先読み
|
(?!X)
|
X、幅ゼロの否定先読み
|
(?<=X)
|
X、幅ゼロの肯定後読み
|
(?<!X)
|
X、幅ゼロの否定後読み
|
(?>X)
|
X、独立した前方参照を行わない正規表現グループ
|
XY
|
X の直後に Y
|
X|Y
|
X または Y
|
X?
|
X、1回または0回
|
X*
|
X、0回以上の繰り返し
|
X+
|
X、1回以上の繰り返し
|
X{n}
|
X、ちょうどn回
|
X(n,}
|
X、n回以上
|
X{n,m}
|
X、n回以上、m回以下
|
X??
|
X、1回または 0回の少ない回数
|
X*?
|
X、0回以上できるだけ少ない回数繰り返す
|
X+?
|
X、1回以上できるだけ少ない回数繰り返す
|
X{n}?
|
X、n回
|
X(n,}?
|
X、少なくともn回以上で、なるべく少ない回数だけ
|
X{n,m}?
|
X、n回以上、m回以下で、なるべく少ない回数だけ
|
X?+
|
X、1または0回でバックトラックしない
|
X*+
|
X、0回以上でバックトラックしない
|
X++
|
X、1回以上でバックトラックしない
|
X{n}+
|
X、n回でバックトラックしない
|
X(n,}+
|
X、n回以上でバックトラックしない
|
X{n,m}+
|
X、n回以上、m回以下でバックトラックしない
|
オプション ↑
Pattern.CASE_INSENSITIVE
|
大文字と小文字を区別しないマッチングを有効にします。
|
Pattern.COMMENTS
|
パターン内で空白とコメントを使用できるようにします。
|
Pattern.DOTALL
|
DOTALL モードを有効にします。
|
Pattern.MULTILINE
|
複数行モードを有効にします。
|
Pattern.UNICODE_CASE
|
Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。
|
Pattern.UNIX_LINES
|
Unix ラインモードを有効にします。
|
サンプル ↑
マッチング ↑
String text = "Hello World!";
Pattern p = Pattern.compile("Hello");
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println("textにHelloはある");
} else {
System.out.println("textにHelloはない");
}
置換 ↑
一括置換を行う場合は、m.replaceAll(".info")となる。
String text = "www.hoge.net";
Pattern p = Pattern.compile("\\.net");
Matcher m = p.matcher(text);
String replaced = m.replaceFirst(".info");
System.out.println(replaced);
文字列の前後の半角および全角の空白とタブだけを削除する。
String text = " 空白 ";
Pattern p = Pattern.compile("^[ \t]+|[ \t]+$");
Matcher m = p.matcher(st);
String replaced = m.replaceAll("");
キャプチャ ↑
キャプチャ用の括弧順にm.group(1)、m.group(2)…からアクセスできる。
String text = "Name: Regular Expressions";
Pattern p = Pattern.compile("^(\\w+):\\s+(.+)$");
Matcher m = p.matcher(text);
if (m.find()) {
String key = m.group(1); // key = "Name";
String value = m.group(2); // value = "Regular Expressions";
System.out.println("key = " + key);
System.out.println("value = " + value);
}
キャプチャの置換 ↑
キャプチャ用の括弧順に$1、$2…と指定できる。
String text = "<a href=\"http://www.hoge.net/\">HOGE</a>";
String replaced = text.replaceFirst("<a href=\"(.+?)\">(.+?)</a>",
"$2 のURLは $1)");
System.out.println(replaced);
文字種ごとの抽出 ↑
String text = "ABCひらがなカタカナ漢字の抽出";
Pattern p = Pattern.compile("(\\p{InBasicLatin}+|"
+ " \\p{InHiragana}+|" + " \\p{InKatakana}+|"
+ " \\p{InCJKUnifiedIdeographs}+)", Pattern.COMMENTS);
Matcher m = p.matcher(text);
while (m.find()) {
String chunk = m.group(1);
System.out.println(chunk);
}
Stringクラスの例 ↑
タグを取り除きます。
String text = "<font size=-2>HTMLの<strong>タグ</strong>を外す</font>";
String replaced = text.replaceAll("<.+?>", "");
System.out.println(replaced);
|