|
||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||
java.lang.Object | +--org.apache.regexp.RE
RE は効率的で軽量な正規表現の評価及びマッチングを行うクラスです。 正規表現は、高度な文字列のマッチングを可能にするパターンの表現です。 文字列をマッチさせることに加えて、マッチした部分を取り出すこともできます。 この機能は、特にテキストの解析に便利です。 正規表現パターンの構文の詳細を以下説明します。
正規表現をコンパイルするために (RE) を用います。REを用いると、下記のように、 パターンを記述した文字列から簡単に RE マッチャーオブジェクトを生成することができます。
RE r = new RE("a*b");
これを行うことにより、RE.match メソッドで文字列のマッチングを実行することができます。次の例
boolean matched = r.match("aaaab");
では、パターン "a*b" が "aaaab" にマッチすると、boolean 型の true が返却されます。
もし、aの数に興味がある場合、最初の例の正規表現を "(a*)b" と変更します。 この正規表現をコンパイルして"xaaaab"にマッチさせたとき、次のような結果になります。
RE r = new RE("(a*)b"); // 正規表現をコンパイル
boolean matched = r.match("xaaaab"); // "xaaaab" にマッチ
String wholeExpr = r.getParen(0); // wholeExpr は 'aaaab'
String insideParens = r.getParen(1); // Parens は 'aaaa'
int startWholeExpr = r.getParenStart(0); // startWholeExpr は 1
int endWholeExpr = r.getParenEnd(0); // endWholeExpr は 6
int lenWholeExpr = r.getParenLength(0); // lenWholeExpr は 5
int startInside = r.getParenStart(1); // startInside は 1
int endInside = r.getParenEnd(1); // endInside は 5
int lenInside = r.getParenLength(1); // lenInside は 4
また、正規表現の中にある、丸括弧の中の正規表現にマッチした中身を参照することもできます。
これを、バックリファレンスと呼びます。正規表現内の最初のバックリファレンスは\1、2番目は\2...という感じで表されます。例えば、次の正規表現
([0-9]+)=\1
は、n=n (例えば、0=0,2=2)で表される任意の文字列にマッチします。
(訳注:jakarta-regexp-1.1では\10以上は使えません)
REで受理される完全正規表現の構文は、下記の通りです。
エスケープ文字
Unicode文字 与えられた Unicode 文字にマッチ \ ('*'のような)メタキャラクタを表現する時に使用 \\ 一つの '\'(バックスラッシュ)文字にマッチ \0nnn 与えられた8進数のコードに対応する文字にマッチ(訳注: 実際には存在しない?) \xhh 8ビットで与えられた2桁の16進数のコードに対応する文字にマッチ \\uhhhh 16ビットで与えられた4桁の16進数のコードに対応する文字にマッチ \t TAB にマッチ \n 改行にマッチ \r 復帰にマッチ \f 改頁にマッチ
標準POSIX文字クラス
[:alnum:] 英数字 [:alpha:] 英字 [:blank:] 空白,TAB [:cntrl:] 制御文字 [:digit:] 数字 [:graph:] 印刷もしくは表示可能な文字(空白は印刷可能であるが表示できない。`a' は両方可能) [:lower:] 小文字アルファベット [:print:] 印刷可能文字 (制御文字でない文字) [:punct:] 句読点文字(アルファベット、数字、制御文字、空白文字以外の文字). [:space:] 空白 (例えば、スペース、TAB、改行). [:upper:] 大文字アルファベット [:xdigit:] 16進数の数字
POSIX 非標準スタイルの文字クラス
[:javastart:] Java 識別子の始まり [:javapart:] Java 識別子の部分
定義済みクラス
. 改行以外の任意の文字にマッチ \w "word"にマッチ (英数字と "_") \W wordでない文字にマッチ \s 空白にマッチ \S 空白以外にマッチ \d 数字にマッチ \D 数字以外にマッチ
境界マッチャー
^ 行の先頭のみにマッチ $ 行の終わりにのみマッチ \b 単語の境界のみにマッチ \B 単語の境界で無い場所にマッチ
欲張りな繰り返し
A* Aに0回以上マッチ(欲張り) A+ Aに1回以上マッチ(欲張り) A? Aに0or1回マッチ(欲張り) A{n} Aにn回マッチ(欲張り) A{n,} Aに少なくともn回マッチ(欲張り) A{n,m} Aにn回以上、m回以下マッチ(欲張り)
非欲張りな繰り返し
A*? Aに0回以上マッチ(非欲張り) A+? Aに1回以上マッチ(非欲張り) A?? Aに0or1回マッチ(非欲張り)
バックリファレンス
\1 1つ目の丸括弧の部分正規表現を参照 \2 2つ目の丸括弧の部分正規表現を参照 \3 3つ目の丸括弧の部分正規表現を参照 \4 4つ目の丸括弧の部分正規表現を参照 \5 5つ目の丸括弧の部分正規表現を参照 \6 6つ目の丸括弧の部分正規表現を参照 \7 7つ目の丸括弧の部分正規表現を参照 \8 8つ目の丸括弧の部分正規表現を参照 \9 9つ目の丸括弧の部分正規表現を参照
全ての繰り返し制御文字 (+, *, ?, {m,n}) は、デフォルトでは欲張り です。欲張りとは、マッチングが失敗するまで可能な限りたくさんの要素にマッチすることを意味します。 もし、繰り返し制御文字を非欲張りにしたい場合は、繰り返し制御文字の後に?を加えます。 非欲張りの繰り返し制御文字を加えることによって、出来るだけ少ない要素とマッチするようになります。ただし、繰り返し制御文字 {m,n} は、非欲張りをサポートしません。
REは、RECompiler クラスによりコンパイルされた正規表現プログラムを実行します。 しかし、RE マッチャークラスは、効率上の理由で、 実際には正規表現をコンパイルする部分を含んでいません。 もし、一つ以上のコンパイル済み正規表現を使いたいなら、下記のように、 コンパイルされた正規表現をコマンドラインから取得し、指定することができます。
// Pre-compiled regular expression "a*b"
char[] re1Instructions =
{
0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
0x0000,
};
REProgram re1 = new REProgram(re1Instructions);
このようにプリコンパイルされた 正規表現 re1 から、
正規表現マッチャー(RE)オブジェクトを生成することができます。
コンパイル済正規表現プログラムを用いることにより、実行時に正規表現のコンパイルのオーバヘッドを避けることができます。
もし、動的な正規表現を必要とすれば、一つの RECompiler オブジェクトを各マッチングで再利用することができます。
同様に、与えられたマッチャーオブジェクトにより、いつでも正規表現プログラムを変更することができます。
しかしながら、RE と RECompiler はスレッドセーフではありません。
(スレッドセーフが要求されることは、滅多にないからです)。そのため、
各スレッドで独立したコンパイラもしくはマッチャーオブジェクトを生成する必要があります。
(でなければ、自分自身で排他制御を行う必要があります)
問題点:
recompile,
RECompiler| フィールドの概要 | |
static int |
MATCH_CASEINDEPENDENT
マッチングがアルファベットの大文字と小文字を区別しないことを示すフラグです。 |
static int |
MATCH_MULTILINE
改行は、BOL/EOL (^ and $)とマッチ |
static int |
MATCH_NORMAL
アルファベットの大文字と小文字を区別することを明示的に示すフラグです。 |
static int |
MATCH_SINGLELINE
全ての入力と一つのテキストとします。 |
static int |
REPLACE_ALL
正規表現にマッチした位置全てを、substメソッドで置換することを示すビットフラグ |
static int |
REPLACE_FIRSTONLY
正規表現にマッチした位置で、substメソッドが最初の一つだけ置換することを指定するビットフラグ |
| コンストラクタの概要 | |
RE()
初期化せずに、正規表現マッチャーを生成します。 |
|
RE(REProgram program)
(バイトコードの)プログラムデータから、 コンパイル済みの正規表現マッチャーを生成します。 |
|
RE(REProgram program,
int matchFlags)
(バイトコードの)プログラムデータから、コンパイル済みの正規表現マッチャーを生成します。 |
|
RE(java.lang.String pattern)
Stringからの正規表現マッチャーのコンストラクタです。 |
|
RE(java.lang.String pattern,
int matchFlags)
Stringからの正規表現マッチャーのコンストラクタです。 |
|
| メソッドの概要 | |
int |
getMatchFlags()
現在のマッチの動作を決めるフラグを返します。. |
java.lang.String |
getParen(int which)
マッチに成功した時に、丸括弧内の部分正規表現にマッチした内容を取り出します。 |
int |
getParenCount()
マッチが成功した後で、丸括弧に入れられた部分正規表現の数を返します。 |
int |
getParenEnd(int which)
与えられた丸括弧にマッチした最後の位置を返します。 |
int |
getParenLength(int which)
与えられた丸括弧にマッチした文字列の長さを返します。 |
int |
getParenStart(int which)
与えられた丸括弧のレベルにおける始まりの位置を返します。 |
REProgram |
getProgram()
マッチャーオブジェクトで使用されている現在の正規表現プログラムを返します。 |
java.lang.String[] |
grep(java.lang.Object[] search)
正規表現にマッチした文字列を文字列の配列として返します。 |
boolean |
match(CharacterIterator search,
int i)
開始位置が与えられた文字列に対して、現在の正規表現プログラムをマッチさせます。 |
boolean |
match(java.lang.String search)
文字列に対して、現在の正規表現プログラムをマッチさせます。 |
boolean |
match(java.lang.String search,
int i)
開始位置が与えられた文字列に対して、現在の正規表現プログラムを マッチさせます。 |
void |
setMatchFlags(int matchFlags)
RE のマッチングの動作を変更するフラグをセットします。 |
void |
setProgram(REProgram program)
このマッチャーオブジェクトによって使われる正規表現プログラムをセットします。 |
static java.lang.String |
simplePatternToFullRegularExpression(java.lang.String pattern)
単純正規表現を完全正規表現 に変換します。 |
java.lang.String[] |
split(java.lang.String s)
正規表現を境界として、文字列を分割し、文字列の配列に格納します。 |
java.lang.String |
subst(java.lang.String substituteIn,
java.lang.String substitution)
正規表現にマッチした文字列を別の文字列に置換します。 |
java.lang.String |
subst(java.lang.String substituteIn,
java.lang.String substitution,
int flags)
正規表現にマッチした文字列を別の文字列に置換します。 |
| クラス java.lang.Object から継承したメソッド |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| フィールドの詳細 |
public static final int MATCH_NORMAL
public static final int MATCH_CASEINDEPENDENT
public static final int MATCH_MULTILINE
public static final int MATCH_SINGLELINE
public static final int REPLACE_ALL
public static final int REPLACE_FIRSTONLY
| コンストラクタの詳細 |
public RE(java.lang.String pattern) throws RESyntaxException
pattern - コンパイルされる正規表現のパターンRESyntaxException - 正規表現が不正な構文を含んでいる場合に発生します。
public RE(java.lang.String pattern,
int matchFlags)
throws RESyntaxException
pattern - コンパイルされる正規表現のパターンRESyntaxException - 正規表現が不正な構文を含んでいる場合に発生します。RECompiler,
recompile
public RE(REProgram program,
int matchFlags)
program - コンパイル済み正規表現プログラム (RECompiler* 、recompile を見よ)matchFlags - RE の動作を決める一つ以上のフラグ (RE.MATCH_*):
MATCH_NORMAL // 通常(アルファベットの大文字と小文字を区別する)マッチング MATCH_CASEINDEPENDENT // アルファベットの大文字と小文字を区別しない(Case folded comparisons) MATCH_MULTILINE // 改行をBOL/EOLとしてマッチ(Newline matches as BOL/EOL)
RECompiler,
REProgram,
recompilepublic RE(REProgram program)
program - コンパイル済み正規表現プログラムRECompiler,
recompilepublic RE()
| メソッドの詳細 |
public static java.lang.String simplePatternToFullRegularExpression(java.lang.String pattern)
pattern - 変換するパターンpublic void setMatchFlags(int matchFlags)
matchFlags - RE の動作を決める一つ以上のフラグ (RE.MATCH_*):
MATCH_NORMAL // 通常(アルファベットの大文字と小文字を区別する)マッチング MATCH_CASEINDEPENDENT // アルファベットの大文字と小文字を区別しない MATCH_MULTILINE // 改行をBOL/EOLとしてマッチ
public int getMatchFlags()
MATCH_NORMAL // 通常(アルファベットの大文字と小文字を区別する)マッチング MATCH_CASEINDEPENDENT // アルファベットの大文字と小文字を区別しない MATCH_MULTILINE // 改行をBOL/EOLとしてマッチ
setMatchFlags(int)public void setProgram(REProgram program)
program - RECompiler によってコンパイルされた正規表現プログラムRECompiler,
REProgram,
recompilepublic REProgram getProgram()
setProgram(org.apache.regexp.REProgram)public int getParenCount()
public java.lang.String getParen(int which)
which - 部分正規表現のネストレベルpublic final int getParenStart(int which)
部分正規表現のネストレベル - public final int getParenEnd(int which)
which - 部分正規表現のネストレベルpublic final int getParenLength(int which)
which - 部分正規表現のネストレベル
public boolean match(java.lang.String search,
int i)
search - マッチさせる文字列i - 開始位置
public boolean match(CharacterIterator search,
int i)
search - マッチさせる文字列i - 開始位置public boolean match(java.lang.String search)
search - マッチさせるテキストpublic java.lang.String[] split(java.lang.String s)
s - この正規表現で分割したい文字列
public java.lang.String subst(java.lang.String substituteIn,
java.lang.String substitution)
substituteIn - 置換させたい文字列substitution - 正規表現によるマッチを置換したい文字列
public java.lang.String subst(java.lang.String substituteIn,
java.lang.String substitution,
int flags)
substituteIn - 置換させたい文字列substitution - 正規表現によるマッチを置換したい文字列public java.lang.String[] grep(java.lang.Object[] search)
search - 探索したいオブジェクトの配列
|
||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||