正規表現は、特定のパターンを使用して文字列のタイプを照合する式であり、いくつかの通常の文字といくつかのメタ文字で構成されます。通常の文字には大文字、小文字、数字が含まれますが、メタ文字には特別な意味があります。正規表現で表現される意味は、.Net プラットフォームでも Java プラットフォームでも同じです。以下では、主に Java 正規表現の機能を分析します。この記事が参考になれば幸いです。
Java 正規表現は非常に複雑なシステムであるため、jdk1.4 で java.util.regex パッケージが開始されて以来、優れた Java 正規表現アプリケーション プラットフォームが提供されてきました。
// バックスラッシュ
/t 間隔('/u0009')
/n 改行 ('/u000A')
/r Enter('/u000D')
/d は数値的に [0-9] と同等です。
/D 非数値は [^0-9] と同等です
/s 空白 [/t/n/x0B/f/r]
/S 非空白文字 [^/t/n/x0B/f/r]
/w 個々の文字 [a-zA-Z_0-9]
/W 非分離文字 [^a-zA-Z_0-9]
/f フォームフィード文字
/e エスケープ
/b 単語の境界
/B 非単語境界
/G 前の試合の終了
^ 制限から始まる
^java 条件は Java で始まる文字に限定されます
$ は制限の終わりです
java$ 条件は、終了文字として java に限定されます
条件は、/n を除く任意の 1 文字を制限します。
java.. 条件は、java の後の改行を除く任意の 2 文字に制限されます
特定の制限「[]」を追加します
[az] 条件は、小文字の a ~ z の範囲内の 1 文字に制限されます。
[AZ] 条件は、大文字の A ~ Z の範囲内の 1 文字に制限されます
[a-zA-Z] 条件は、小文字の a ~ z または大文字の A ~ Z の範囲内の 1 文字に限定されます。
[0-9] 条件は小文字の 0 ~ 9 の範囲の 1 文字に限定されます。
[0-9a-z] 条件は、小文字の 0 ~ 9 または a ~ z の範囲の 1 文字に限定されます。
[0-9[az]] 条件は、小文字の 0 ~ 9 または a ~ z の範囲の 1 文字 (交差点) に限定されます。
[] に ^ を追加し、別の制限「[^]」を追加します
[^az] 条件は、小文字以外の a ~ z の範囲内の 1 文字に制限されます。
[^AZ] 条件は、大文字以外の A ~ Z の範囲内の 1 文字に制限されます
[^a-zA-Z] 条件は、小文字以外の a ~ z または大文字の A ~ Z の範囲内の 1 文字に制限されます。
[^0-9] 条件は、小文字以外の 0 ~ 9 の範囲内の 1 文字に制限されます。
[^0-9a-z] 条件は、小文字以外の 0 ~ 9 または a ~ z の範囲内の 1 文字に限定されます。
[^0-9[az]] 条件は、小文字以外の 0 ~ 9 または a ~ z の範囲の 1 文字 (交差) に限定されます。
特定の文字が0回以上出現することを制限条件とする場合、「*」を使用できます。
J*0J以上
.* 0 文字以上
J.* DJ と D の間に 0 文字以上
特定の文字が複数回出現するという制限条件がある場合は、「+」を使用できます。
J+1以上 J
.+ 1 文字以上
J.DJ と D の間に 1 文字以上の文字を追加
特定の文字が0回以上出現するという制限がある場合は、「?」を使用できます。
JA? J または JA が表示されます。
文字「{a}」の連続出現を指定された数に制限します
じ{2}
じ{3}
文字が複数あり、「{a,}」
J{3,} JJJ,JJJJ,JJJJJ,???(Jが3回以上共存)
文字以上 b 文字未満「{a,b}」
J{3,5} JJJ または JJJJ または JJJJJ
2 つの「|」のいずれかを選択します。
J|AJ または A
Java|Hello Java または Hello
「()」は組み合わせの型を指定します<BR>たとえば、<a href="index.html/">index</a>の<a href></a>間のデータをクエリする場合、次のように記述できます。 <a .*href=/".*/">(.+?)</a> として
Pattern.compile 関数を使用する場合、Java 正規表現の一致動作を制御するパラメーターを追加できます。
パターン Pattern.compile(文字列正規表現、int フラグ)
flag の値の範囲は次のとおりです。
Pattern.CANON_EQ 2 つの文字の「正規分解」がまったく同じである場合にのみ、一致と見なされます。たとえば、このフラグを使用すると、式「a/u030A」は「?」と一致します。デフォルトでは、「正規の等価性」は考慮されません。
パターン.CASE_INSENSITIVE(?i)
デフォルトでは、大文字と小文字を区別しない一致は US-ASCII 文字セットでのみ機能します。このフラグにより、大文字と小文字に関係なく式が照合されます。 Unicode 文字の明確なマッチングを実行するには、UNICODE_CASE とこのフラグを組み合わせるだけです。
パターン.COMMENTS(?x)
このモードでは、Java 正規表現内のスペース文字は照合時に無視されます (翻訳者注: 式内の「//s」を指すのではなく、式内のスペース、タブ、キャリッジ リターンなどを指します)。 。コメントは # で始まり、行の終わりまで続きます。 Unix ライン モードは、埋め込みフラグを介して有効にすることができます。
パターン.DOTALL(?s)
このモードでは、式「.」は行末を含む任意の文字と一致します。デフォルトでは、式「.」は行終端文字と一致しません。
パターン.MULTILINE(?m)
このモードでは、「^」と「$」はそれぞれ行の先頭と行末に一致します。さらに、「^」は引き続き文字列の先頭と一致し、「$」も文字列の末尾と一致します。デフォルトでは、これら 2 つの式は文字列の先頭と末尾のみに一致します。
パターン.UNICODE_CASE(?u)
このモードでは、CASE_INSENSITIVE フラグも有効にすると、大文字と小文字を区別せずに Unicode 文字と一致します。デフォルトでは、大文字と小文字を区別しない一致は US-ASCII 文字セットでのみ機能します。
Pattern.UNIX_LINES(?d)
このモードでは、「/n」のみが改行とみなされ、「.」、「^」、および「$」と照合されます。曖昧な概念はさておき、Java の簡単な通常の使用例をいくつか示します。
◆例えば文字列にバリデーションが含まれている場合
次のようにコードをコピーします。
//Java で始まり何かで終わる文字列を検索します
パターン pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java は人間ではありません");
boolean b= matcher.matches(); //条件が満たされた場合は true が返され、そうでない場合は false が返されます。
System.out.println(b);
文字列を複数の条件で分割する場合
次のようにコードをコピーします。
パターン 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.compile("Java 正規表現");
マッチャー matcher = pattern.matcher("Java 正規表現 Hello World, 正規表現 Hello World");
// 規則的なパターンに一致する最初のデータを置換します
System.out.println(matcher.replaceFirst("Java"));
テキスト置換(すべて)
次のようにコードをコピーします。
パターン pattern = Pattern.compile("Java 正規表現");
マッチャー matcher = pattern.matcher("Java 正規表現 Hello World, 正規表現 Hello World");
// 規則的なパターンに一致する最初のデータを置換します
System.out.println(matcher.replaceAll("Java"));
リテラル置換(文字の置換)次のようにコードをコピーします。
パターン pattern = Pattern.compile("Java 正規表現");
マッチャー matcher = pattern.matcher("Java 正規表現 Hello World, 正規表現 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
メールアドレスであるかどうかを確認してください次のようにコードをコピーします。
文字列 str="
[email protected]";
パターン pattern = Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSITIVE );
マッチャー matcher = pattern.matcher(str);
System.out.println(matcher.matches());
HTMLタグを削除する次のようにコードをコピーします。
パターン pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
マッチャー matcher = pattern.matcher("<a href=/"index.html/">ホームページ</a>");
文字列 string = matcher.replaceAll("");
System.out.println(文字列);
HTML 内の対応する条件文字列を検索します。次のようにコードをコピーします。
パターン pattern = Pattern.compile("href=/"(.+?)/"");
マッチャー matcher = pattern.matcher("<a href=/"index.html/">ホームページ</a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
◆http://アドレス<BR>コードをインターセプト次のようにコードをコピーします。
//URLをインターセプトする
パターン pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
マッチャー matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer バッファ = new StringBuffer();
while(matcher.find()){
バッファ.append(matcher.group());
バッファ.append("/r/n");
System.out.println(buffer.toString());
}
◆指定された{}漢字の<BR>コードを置き換えます。
次のようにコードをコピーします。
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) {
文字列 temp=sourceString;
for(int i=0;i<object.length;i++){
文字列[] 結果=(文字列[])オブジェクト[i];
パターン pattern = Pattern.compile(result[0]);
マッチャー matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
戻り温度;
}
◆通常の条件を使用して、指定されたディレクトリ内のファイル<BR>コードをクエリします。次のようにコードをコピーします。
//ファイルリストのキャッシュに使用されます
プライベート ArrayList ファイル = new ArrayList();
//ファイルパスをホストするために使用されます
プライベート文字列_path;
//マージされていない通常の数式を運ぶために使用されます
プライベート文字列_regexp;
class MyFileFilter は FileFilter を実装します {
/**
* ファイル名を一致させる
*/
public boolean accept(ファイル file) {
試す {
パターン pattern = Pattern.compile(_regexp);
マッチャーの一致 = pattern.matcher(file.getName());
match.matches() を返します。
} catch (例外 e) {
true を返します。
}
}
}
/**
* 入力ストリームを解析する
* @param入力
*/
FilesAnalyze (文字列パス,文字列正規表現){
getFileName(パス,正規表現);
}
/**
* ファイル名を解析してファイルを追加します
* @param入力
*/
private void getFileName(String path,String regexp) {
//目次
_path=パス;
_regexp=正規表現;
ファイルディレクトリ = 新しいファイル(_パス);
File[] filesFile = directory.listFiles(new MyFileFilter());
if (filesFile == null) が返される;
for (int j = 0; j < filesFile.length; j++) {
files.add(filesファイル[j]);
}
戻る;
}
/**
※出力情報の表示
* @param アウト
*/
public void print (PrintStream out) {
イテレータ要素 = files.iterator();
while (elements.hasNext()) {
ファイル file=(ファイル) elements.next();
out.println(file.getPath());
}
}
public static void Output(String path,String regexp) {
FilesAnalyze fileGroup1 = 新しい FilesAnalyze(path,regexp);
fileGroup1.print(System.out);
}
public static void main (String[] args) {
出力("C://","[Az|.]*");
}
実際、Java 正規表現には多くの機能があります。文字処理であれば、正規表現でできないことはありません。