Java正則表現入門基本編(新米必見)
正規表現はモードマッチングと置換のために使用できる仕様で、正規表現は普通の文字(たとえば文字aからzまで)と特殊文字(元文字)からなるテキストモードであり、テキスト本体を検索する際にマッチする1つまたは複数の文字列を記述するために使用されます。正規表現はテンプレートとして、検索した文字列にマッチします。
周知のように、プログラム開発においては、マッチング、検索、置換、判断文字列が必要となる場合がありますが、これらの状況は時には複雑で、純粋な符号化で解決すれば、プログラマの時間と精力を浪費することがよくあります。したがって、学習と正規表現の使用は、この矛盾を解決する主要な手段となります。
ご存知のように、正規表現はモードマッチングと置換のための規範であり、一つの正規表現は普通の文字(例えば、文字aからz)と特殊文字(元文字)からなる文字パターンであり、テキスト本体を検索する際にマッチする1つまたは複数の文字列を記述するために使用される。正規表現はテンプレートとして、検索した文字列にマッチします。
jdk 1.4がjava.util.regexパッケージを発売してから、私達のためにとても良いJAVA正規表現応用プラットフォームを提供してくれました。
正規表現は複雑な体系ですので、入門の概念を挙げます。もっと多いのは関連書籍と自分で模索してください。
//バックスラッシュ
//t間隔('/u 0009')
//n改行('/u 000 A')
/rバック('/u 000 D')
/d数字は[0-9]に等しい。
/D非数値は[^0-9]に等しい。
/sブランク記号[/t/n/x 0 B/f/r]
/S非空白記号[^/t/n/x 0 B/f/r]
/w単独文字[a-zA-Z_]0-9]
/W非個別文字[^a-zA-Z_]0-9]
/f変換子
//e Escape
/b単語の境界
/B単語以外の境界
/Gの前のマッチの終了
^制限の先頭
^java 条件はJavaで始まる文字に制限されています。
$は制限の最後です
java 条件はjavaを最後の文字に制限します。
..。 条件制限/n以外の任意の単独文字
java. 条件はjavaに制限されています。改行以外の任意の2文字です。
特定制限条件「[]」を追加します。
[a-z] 条件は小文字a to zの範囲の1文字に制限されます。
[A-Z] 条件は大文字A to Z範囲の1文字に制限されます。
[a-z A-Z]条件は、小文字a to zまたは大文字A to Zの範囲の1文字に制限されます。
[0-9] 条件は小文字0ト9の範囲の1文字に制限されます。
[0-9 a-z]条件は、小文字0ト9またはa to z範囲の1文字に制限されます。
[0-9[a-z]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
[]に^を加えて再制限条件[^]]を追加します。
[^a-z] 条件は小文字以外のA to z範囲の1文字に制限されます。
[^A-Z] 条件は大文字以外のA to Z範囲の1文字に制限されます。
[^a-z A-Z]条件は、小文字でないa to zまたは大文字A to Zの範囲の1文字に制限されます。
[^0-9] 条件は小文字0ト9以外の範囲の1文字に制限されます。
[^0-9 a-z]条件は、小文字0ト9またはa to zの範囲の1文字に制限されます。
[^0-9[a-z]]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
制限条件が特定文字で0回以上発生した場合は、「*」を使用することができます。
J* 0個以上J
..。 0以上の任意の文字
J.**D JとDの間に0以上の任意の文字があります。
制限条件が特定の文字で1回以上発生した場合は「+」を使用できます。
J+。 1個以上J
..。 1つ以上の任意の文字
J.+D JとDの間に1つ以上の任意の文字があります。
制限条件が特定の文字で0または1回以上発生した場合、「?」を使用することができます。
JA JかJAが現れます
指定回数の連続表示に制限されています。「{a}」
J{2} JJ。
J{3} JJ
文字a個以上、そして「{a,}」
J{3,} JJ、JJJJ、JJJJJ、3回以上J共存)
文字以上、b個以下「{a,b}」
J{3,5} JJまたはJJJJまたはJJJJJ JJJ
両者は一つの「124」を取る
J 124 A JまたはA
Java𞓜ハロー JavaまたはHello
「()」でグループのタイプを指定します。
例えば、私はindexの中の間のデータを調べたら、(.+?)
Pattern.co mpile関数を使用すると、正規表現の整合挙動を制御するパラメータを追加できます。
Pattern Pattern.co mpile(String regex,int flags)
flagsの取得範囲は以下の通りです。
Pattern.C.ANON_EQ 二つの文字の「正規分解(canonical decompation)」が完全に同じである場合にのみ、マッチングが認められます。例えば、このマークを使うと、「a/u 030 A」と表現が一致します。デフォルトでは「標準同等性」は考えられません。
Pattern.CC ASE_INSENSITIVE(i) デフォルトでは、大文字小文字不明感のマッチングはUS-SCII文字セットのみに適用されます。このフラグは、表式を無視して大文字と小文字を一致させることができます。Unicodeの文字にサイズ不明感のマッチングをするには、UNIKODE(u)が必要です。CASEはこのマークと合わせればいいです。
Pattern.CC OMMENTS(x) このようなモードでは、マッチング時にスペース記号は無視されます。注釈は葃から始まり、この行が終わるまで。埋め込みマークでUnix行モードを有効にできます。
Pattern.DOTALL(s) このモードでは、表式'.'は任意の文字にマッチし、行を表す終端符を含む。デフォルトでは、表式''が行にマッチしない終端符です。
Pattern.MULTILINE
(?m) このモードでは、'^''と'''は、それぞれ一行の開始と終了を一致させる。また、'^'は文字列の開始にマッチしています。'$も文字列にマッチして終了します。デフォルトでは、この2つの表現は文字列の開始と終了にのみマッチします。
Pattern.UNICODE_CASE
(?u) このモードで、もしあなたがCASE_を有効にしたら。INSENSITIVEフラグは、Unicodeの文字に対して、大文字と小文字の区別のないマッチングを行います。デフォルトでは、大文字と小文字の不感度のマッチングはUS-SCII文字セットにのみ適用されます。
Pattern.UNIX_LINE(d) このモードでは、'n'だけが一行の中止と見なされ、'.','^',''と一致します。
空泛の概念を抜きにして、簡単なJava正則のいくつかの用例を書き出します。
◆たとえば、文字列に検証が含まれている場合
String str=「[email protected]」
Pattern pattern=Pattern.co mpile("///w///////-"+@(//////-)+[/////]+[////w/-]+]Pattern.cASE_INSENSITIVE)
Match matcher=pattern.matcher(str);
System.out.println(matcher.matches();
◆htmlタグを除く
周知のように、プログラム開発においては、マッチング、検索、置換、判断文字列が必要となる場合がありますが、これらの状況は時には複雑で、純粋な符号化で解決すれば、プログラマの時間と精力を浪費することがよくあります。したがって、学習と正規表現の使用は、この矛盾を解決する主要な手段となります。
ご存知のように、正規表現はモードマッチングと置換のための規範であり、一つの正規表現は普通の文字(例えば、文字aからz)と特殊文字(元文字)からなる文字パターンであり、テキスト本体を検索する際にマッチする1つまたは複数の文字列を記述するために使用される。正規表現はテンプレートとして、検索した文字列にマッチします。
jdk 1.4がjava.util.regexパッケージを発売してから、私達のためにとても良いJAVA正規表現応用プラットフォームを提供してくれました。
正規表現は複雑な体系ですので、入門の概念を挙げます。もっと多いのは関連書籍と自分で模索してください。
//バックスラッシュ
//t間隔('/u 0009')
//n改行('/u 000 A')
/rバック('/u 000 D')
/d数字は[0-9]に等しい。
/D非数値は[^0-9]に等しい。
/sブランク記号[/t/n/x 0 B/f/r]
/S非空白記号[^/t/n/x 0 B/f/r]
/w単独文字[a-zA-Z_]0-9]
/W非個別文字[^a-zA-Z_]0-9]
/f変換子
//e Escape
/b単語の境界
/B単語以外の境界
/Gの前のマッチの終了
^制限の先頭
^java 条件はJavaで始まる文字に制限されています。
$は制限の最後です
java 条件はjavaを最後の文字に制限します。
..。 条件制限/n以外の任意の単独文字
java. 条件はjavaに制限されています。改行以外の任意の2文字です。
特定制限条件「[]」を追加します。
[a-z] 条件は小文字a to zの範囲の1文字に制限されます。
[A-Z] 条件は大文字A to Z範囲の1文字に制限されます。
[a-z A-Z]条件は、小文字a to zまたは大文字A to Zの範囲の1文字に制限されます。
[0-9] 条件は小文字0ト9の範囲の1文字に制限されます。
[0-9 a-z]条件は、小文字0ト9またはa to z範囲の1文字に制限されます。
[0-9[a-z]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
[]に^を加えて再制限条件[^]]を追加します。
[^a-z] 条件は小文字以外のA to z範囲の1文字に制限されます。
[^A-Z] 条件は大文字以外のA to Z範囲の1文字に制限されます。
[^a-z A-Z]条件は、小文字でないa to zまたは大文字A to Zの範囲の1文字に制限されます。
[^0-9] 条件は小文字0ト9以外の範囲の1文字に制限されます。
[^0-9 a-z]条件は、小文字0ト9またはa to zの範囲の1文字に制限されます。
[^0-9[a-z]]条件は、小文字0 to 9またはa to z範囲の1文字に制限されます(交叉)
制限条件が特定文字で0回以上発生した場合は、「*」を使用することができます。
J* 0個以上J
..。 0以上の任意の文字
J.**D JとDの間に0以上の任意の文字があります。
制限条件が特定の文字で1回以上発生した場合は「+」を使用できます。
J+。 1個以上J
..。 1つ以上の任意の文字
J.+D JとDの間に1つ以上の任意の文字があります。
制限条件が特定の文字で0または1回以上発生した場合、「?」を使用することができます。
JA JかJAが現れます
指定回数の連続表示に制限されています。「{a}」
J{2} JJ。
J{3} JJ
文字a個以上、そして「{a,}」
J{3,} JJ、JJJJ、JJJJJ、3回以上J共存)
文字以上、b個以下「{a,b}」
J{3,5} JJまたはJJJJまたはJJJJJ JJJ
両者は一つの「124」を取る
J 124 A JまたはA
Java𞓜ハロー JavaまたはHello
「()」でグループのタイプを指定します。
例えば、私はindexの中
Pattern.co mpile関数を使用すると、正規表現の整合挙動を制御するパラメータを追加できます。
Pattern Pattern.co mpile(String regex,int flags)
flagsの取得範囲は以下の通りです。
Pattern.C.ANON_EQ 二つの文字の「正規分解(canonical decompation)」が完全に同じである場合にのみ、マッチングが認められます。例えば、このマークを使うと、「a/u 030 A」と表現が一致します。デフォルトでは「標準同等性」は考えられません。
Pattern.CC ASE_INSENSITIVE(i) デフォルトでは、大文字小文字不明感のマッチングはUS-SCII文字セットのみに適用されます。このフラグは、表式を無視して大文字と小文字を一致させることができます。Unicodeの文字にサイズ不明感のマッチングをするには、UNIKODE(u)が必要です。CASEはこのマークと合わせればいいです。
Pattern.CC OMMENTS(x) このようなモードでは、マッチング時にスペース記号は無視されます。注釈は葃から始まり、この行が終わるまで。埋め込みマークでUnix行モードを有効にできます。
Pattern.DOTALL(s) このモードでは、表式'.'は任意の文字にマッチし、行を表す終端符を含む。デフォルトでは、表式''が行にマッチしない終端符です。
Pattern.MULTILINE
(?m) このモードでは、'^''と'''は、それぞれ一行の開始と終了を一致させる。また、'^'は文字列の開始にマッチしています。'$も文字列にマッチして終了します。デフォルトでは、この2つの表現は文字列の開始と終了にのみマッチします。
Pattern.UNICODE_CASE
(?u) このモードで、もしあなたがCASE_を有効にしたら。INSENSITIVEフラグは、Unicodeの文字に対して、大文字と小文字の区別のないマッチングを行います。デフォルトでは、大文字と小文字の不感度のマッチングはUS-SCII文字セットにのみ適用されます。
Pattern.UNIX_LINE(d) このモードでは、'n'だけが一行の中止と見なされ、'.','^',''と一致します。
空泛の概念を抜きにして、簡単なJava正則のいくつかの用例を書き出します。
◆たとえば、文字列に検証が含まれている場合
// Java ,
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java ");
boolean b= matcher.matches();
// , true, false
System.out.println(b);
◆複数条件で文字列を分割する場合
Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}
◆テキスト置換(最初の文字が表示されます)
Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher(" Hello World, Hello World");
//
System.out.println(matcher.replaceFirst("Java"));
◆テキスト置換(全部)
Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher(" Hello World, Hello World");
//
System.out.println(matcher.replaceAll("Java"));
◆文字置換(置換文字)
Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher(" Hello World, Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
◆メールアドレスであるか確認するString str=「[email protected]」
Pattern pattern=Pattern.co mpile("///w///////-"+@(//////-)+[/////]+[////w/-]+]Pattern.cASE_INSENSITIVE)
Match matcher=pattern.matcher(str);
System.out.println(matcher.matches();
◆htmlタグを除く
Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=/"index.html/"> </a>");
String string = matcher.replaceAll("");
System.out.println(string);
◆htmlでの対応条件文字列の検索
Pattern pattern = Pattern.compile("href=/"(.+?)/"");
Matcher matcher = pattern.matcher("<a href=/"index.html/"> </a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
◆http://住所の切り取り
// url
Pattern pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("/r/n");
System.out.println(buffer.toString());
}
◆指定{}のテキストを置換する
String str = "Java {0} -{1} ";
String[][] object={new String[]{"//{0//}","1995"},new String[]{"//{1//}","2007"}};
System.out.println(replace(str,object));
public static String replace(final String sourceString,Object[] object) {
String temp=sourceString;
for(int i=0;i<object.length;i++){
String[] result=(String[])object[i];
Pattern pattern = Pattern.compile(result[0]);
Matcher matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
return temp;
}
◆指定されたディレクトリの下のファイルを正規の条件で照会する
//
private ArrayList files = new ArrayList();
//
private String _path;
//
private String _regexp;
class MyFileFilter implements FileFilter {
/**
*
*/
public boolean accept(File file) {
try {
Pattern pattern = Pattern.compile(_regexp);
Matcher match = pattern.matcher(file.getName());
return match.matches();
} catch (Exception e) {
return true;
}
}
}
/**
*
* @param inputs
*/
FilesAnalyze (String path,String regexp){
getFileName(path,regexp);
}
/**
* files
* @param input
*/
private void getFileName(String path,String regexp) {
//
_path=path;
_regexp=regexp;
File directory = new File(_path);
File[] filesFile = directory.listFiles(new MyFileFilter());
if (filesFile == null) return;
for (int j = 0; j < filesFile.length; j++) {
files.add(filesFile[j]);
}
return;
}
/**
*
* @param out
*/
public void print (PrintStream out) {
Iterator elements = files.iterator();
while (elements.hasNext()) {
File file=(File) elements.next();
out.println(file.getPath());
}
}
public static void output(String path,String regexp) {
FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
fileGroup1.print(System.out);
}
public static void main (String[] args) {
output("C://","[A-z|.]*");
}
Java正則の機能はまだたくさんありますが、実際には文字処理だけではできないことがあります。もちろん、正則の説明に時間がかかります。