1. regex (正規表現): RegularExpressions (StringTokenizer に代わる); Unix で人気のある文字列処理の強力なツールですが、Perl は正規表現を使用するとさらに優れています。
主に文字列のマッチング、検索、置換に使用されます。たとえば、IP (256 未満の範囲) の照合は正規表現で簡単に使用できます。Web ページから大量の電子メール アドレスを抽出してスパムを送信します。 Matcher (文字列をパターンと照合した結果) とパターンが含まれます。
次のようにコードをコピーします。
/*
* この文字列が指定された正規表現 (文字列でも) と一致するかどうかを示します。
*/
System.out.println("abc".matches("..."));//各「.」は文字を表します
次のようにコードをコピーします。
/*
* 文字列内のすべての数字を「-」に置き換えます。 通常の方法では、charAt を 1 つずつ判断する必要があります。
* "//d" は任意の数値を表すか、"[0-9]" に置き換えます。
* 「//D」は数字以外を表すか、「[^0-9]」に置き換えられます。
*/
System.out.println("ab54564654sbg48746bshj".replaceAll("[0-9]", "-"));//各「.」は 1 文字を表します
二、
次のようにコードをコピーします。
/*
* コンパイルは、指定された正規表現をパターンにコンパイルします (各コンパイルには時間がかかります)。{3} は正確に 3 回を意味します。
* X{n} X、正確に n 回
* X{n,} X、少なくとも n 回
* X{n,m} X、少なくとも n 回、最大 m 回
*/
パターン p = Pattern.compile("[az]{3}");
Matcher m = p.matcher("ggs");//このパターンで指定された入力と一致するマッチャーを作成します。内部的には、優先状態オートマトンが実際に作成されます (コンパイル原理)
//マッチャーで照合される文字列は実際には CharSequence (インターフェース) ですが、String はこのインターフェースを実装しており、多態性を持っています
System.out.println(m.matches());//「ggss」の場合は一致しません
//いつでも直接 "ggs".matches("[az]{3}") を実行できますが、上記には利点があり、少なくともより効率的であり、パターンとマッチャーは多くの関数を提供します
3. 正規表現でメタ文字を呼び出します。「. * +」; Ctrl + SHIFT + 「/」はコメントを意味します。コメントを削除するには、「/」に置き換えます。
次のようにコードをコピーします。
"a".matches(".");//true、「.」は漢字を含む任意の文字を表します
"aa".matches("aa");//true、つまり、通常の文字列も正規表現として使用できます
/*
* true、「*」は 0 文字以上を意味しますが、後続の文字は最初の文字と同じである必要があります。
※ それ以外の場合は false、つまり単一文字からなる文字列かどうかを判定します。
*/
"aaaa".matches("a*");
"".matches("a*");//true
"aaa".matches("a?");//true、1 回または 0 回
"".matches("a?");//true
"a".matches("a?");//true
"544848154564113".matches("//d{3,100}");//true
//最も単純なIP判定ですが、255を超えると判定できません。
"192.168.0.aaa".matches("//d{1,3}//.//d{1,3}//.//d{1,3}//d{1,3}" );
"192".matches("[0-2][0-9][0-9]");
4. [abc] は任意の文字と一致することを意味し、[^abc] は abc 以外の文字を意味します (文字である必要があり、空の文字列の場合は false が返されます)。 「[az ]|[AZ]」は特定の大文字または小文字です。[AZ&&[ABS]] は大文字と ABS のいずれかを意味します。
次のようにコードをコピーします。
// | と || には違いがないことがわかりましたが、& と && には違いがあります。これが正しい理解方法かどうかはわかりません。
System.out.println("C".matches("[AZ&&[ABS]]"));//false
System.out.println("C".matches("[AZ&[ABS]]"));//true
System.out.println("A".matches("[AZ&&[ABS]]"));//true
System.out.println("A".matches("[AZ&[ABS]]"));//true
System.out.println("C".matches("[AZ|[ABS]]"));//true
System.out.println("C".matches("[AZ||[ABS]]"));//true
5. /w 単語文字: [a-zA-Z_0-9] ユーザー名と一致する場合: /s 空白文字: [ /t/n/x0B/f/r]; /S 非空白文字: [^/s] ] ;/W 単語以外の文字: [^/w]。
次のようにコードをコピーします。
" /n/t/r".matches("//s{4}");//true
" ".matches("//S");//false
"a_8".matches("//w{3}");//true
//「+」は 1 回または複数回を意味します
"abc888&^%".matches("[az]{1,3}//d+[&^#%]+");//true
/*
※照合対象の文字はバックスラッシュのみですが、「/」とその後に続く「,」を組み合わせる事はできません。
※前回の「一致しない場合はCEとなります。
* の後に「//」を続けることはできません。そうしないと実行時エラーが発生します(コンパイルでは問題ありません)。「////」と記述する必要があります。
*/
System.out.println("//".matches("////"));//true
6. POSIX 文字クラス (US-ASCII のみ)
次のようにコードをコピーします。
/p{Lower} 英小文字: [az] ;/p{Upper} 英大文字: [AZ] ;/p{ASCII} すべての ASCII: [/x00-/x7F] ;/p{Alpha} 英字: [/p{下位}/p{上位}] ;/p{桁} 10 進数: [0-9]。
7. 境界マッチャー
^ 行の始まり $ 行の終わり/b 単語の境界/B 非単語の境界/A 入力の始まり/G 前の一致の終わり/Z 入力の終わり、最後のターミネータ (存在する場合) にのみ使用されます。
/z 入力の終わり
次のようにコードをコピーします。
"hello world".matches("^h.*");//^ 行の先頭
"hello world".matches(".*ld$");//$line の終わり
"hello world".matches("^h[az]{1,3}o//b.*");///bword 境界
"helloworld".matches("^h[az]{1,3}o//b.*");
" /n".matches("^[//s&&[^//n]]*//n$");//空白文字で始まる空白行を判定
8. find メソッドで m.start() と m.end() を使用して、開始位置と終了位置の間の次のものを返すこともできます。見つからない場合はエラーが発生します。
次のようにコードをコピーします。
パターン p = Pattern.compile("//d{3,5}");
文字列 s = "133-34444-333-00";
マッチャー m = p.matcher(s);
m.matches();//matches はすべての文字列に一致します
m.reset();
/*
※以下でresetメソッドを先に呼び出した場合はtrue、true、true、falseが出力されます。
* それ以外の場合、最後から 2 番目の検索でも false が出力されます。
※理由は以下の通りです。
* 一致は最初の「-」に一致し、一致しないことがわかりますが、これらの 4 文字が食べられている場合は、再度一致から始まります。
* 34444 が始まり、2 番目の検索は 333 から始まります。これは、検索が次のサブシーケンスと一致するためです。
* リセット メソッドを使用すると、マッチが食べた文字列をマッチから吐き出すことができます。
* 要約: 一致と検索は相互に影響を与えるため、一致と検索の間にリセットを使用する必要があります。
*
*/
m.find();
m.find();
m.find();//このパターンに一致する入力シーケンスの次のサブシーケンスの検索を試みます
m.find();
/*
* 領域の先頭から始まる入力シーケンスをこのパターンと照合しようとします。
* Thinking in java の著者は、この方法を厳しく批判しました。単語からはどこからマッチングを開始すればよいのかが不明瞭であるためです。
* 毎回最初から開始するため、以下はすべて当てはまります
*/
m.lookAt();
m.lookAt();
m.lookAt();
m.lookAt();
9. 弦の交換
次のようにコードをコピーします。
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
パブリック クラス TestRegexReplacement {
public static void main(String[] args) {
Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//次のパラメータは整数であり、「大文字と小文字を区別しない」ことを意味します
Matcher m = p.matcher("Java java hxsyl Ilovejava java JaVaAcmer");
while(m.find()) {
System.out.println(m.group());//m.group はすべての Java を出力します (大文字と小文字は無視します)。
}
String s = m.replaceAll("Java");//String にもこのメソッドがあります
System.out.println;
m.reset();//find と matcher は相互に影響を与えるため追加する必要があります
StringBuffer sb = new StringBuffer();
int i = 0;
/*
※以下の方法は、見つかったjavaの奇数を「Java」、偶数を「java」に置き換える方法です。
*/
while(m.find()) {
i++;
// i&1 として直接記述することはできないため、ブール値に変換する必要があります
if((i&1)==1) {
m.appendReplacement(sb, "Java");
}それ以外 {
m.appendReplacement(sb, "java");
}
}
m.appendTail(sb);//最後に見つかった java の後に残りの文字列を追加します
System.out.println(sb);//リセットせずにAcmerのみを出力します
}
}
10. グループ化
次のようにコードをコピーします。
/*
* それぞれ括弧を追加します。最も外側の中括弧はカウントしません。最初の左括弧が最初のグループです。
*/
パターン p = Pattern.compile("(//d{3,5})([az]{2})");
文字列 s = "123aaa-77878bb-646dd-00";
マッチャー m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));// 一致する数値の各ペアを出力します
System.out.println(m.group(2));// 一致する文字の各ペアを出力します
}
11. Web ページから電子メールをキャプチャする
次のようにコードをコピーします。
java.io.BufferedReaderをインポートします。
インポートjava.io.FileNotFoundException;
java.io.FileReaderをインポートします。
インポート java.io.IOException;
java.util.regex.Matcherをインポートします。
java.util.regex.Patternをインポートします。
/*
※飼育方法が必要な場合は、先に方法名を記載してください。
* 次に Ctrl + 1 を押すと推奨事項がリストされ、システムがこのメソッドを作成します
*/
パブリック クラス EmailSpider {
public static void main(String[] args) {
// TODO 自動生成されたメソッド スタブ
試す {
BufferedReader br = new BufferedReader(new FileReader("F://regex.html"));
文字列行 = "";
試す {
while((line=br.readLine())!=null) {
解決(行);
}
} キャッチ (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
private static voidsolve(String line) {
// TODO 自動生成されたメソッド スタブ
//正規表現が対応する関数と一致しない場合でも、文字列であるためエラーにはなりません。
パターン p = Pattern.compile("[//w[.-]]+@[//w[.-]]+//.[//w]+");
マッチャー m = p.matcher(line);
while(m.find()) {
System.out.println(m.group());
}
}
}
12. コード統計
次のようにコードをコピーします。
コードを表示
/*
* コード内の空白行、コメント行、プログラム行の数を数える
* 実際には、文字列でstartsWithとendsWithを使用することもできます。
* プロジェクト マネージャーが使用する場合は、怠惰を防ぐために各行の文字数が {; で終わるかどうかもカウントする必要があります。
*/
java.io.BufferedReaderをインポートします。
java.io.ファイルをインポートします。
インポートjava.io.FileNotFoundException;
java.io.FileReaderをインポートします。
インポート java.io.IOException;
パブリック クラス CoderCount {
静的長いnormalLines = 0;
静的な長いコメント行 = 0;
静的な長いwhiteLines = 0;
public static void main(String[] args) {
ファイル f = 新しい File("D://share//src");
File[] codeFiles = f.listFiles();
for(ファイルの子: codeFiles){
if(child.getName().matches(".*//.java$")) {
解決(子);
}
}
System.out.println("normalLines:" + NormalLines);
System.out.println("commentLines:" + commentLines);
System.out.println("whiteLines:" + WhiteLines);
}
private static voidsolve(File f) {
BufferedReader br = null;
ブール値コメント = false;
試す {
br = 新しい BufferedReader(新しい FileReader(f));
文字列行 = "";
while((line = br.readLine()) != null) {
/*
* //一部のコメント行の前にタブがあります
* readLine の後には書き込めません
※最終行はnullポインタになります
*/
line = line.trim();
//readLine は文字列を読み取った後に改行を削除します。
if(line.matches("^[//s&&[^//n]]*$")) {
ホワイトライン++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
コメント行++;
コメント = true;
else if (line.startsWith("/*") && line.endsWith("*/")) {
コメント行++;
} else if (true == コメント) {
コメント行++;
if(line.endsWith("*/")) {
コメント = 偽;
}
else if (line.startsWith("//")) {
コメント行++;
} それ以外 {
ノーマルライン++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
} ついに {
if(br != null) {
試す {
br.close();
br = null;
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}
}
}
13. 数量指定子
含む? *+; デフォルトは Greedy、および Reluctant および Possessive (排他的) です。
次のようにコードをコピーします。
//よりわかりやすく表示するためにグループ化が追加されています。
パターン p = Pattern.compile("(.{3,10})+[0-9]");
String s = "aaaa5bbbb6";//長さは 10 です
マッチャー m = p.matcher(s);
/*
* 0 ~ 10 を出力するようになりました。デフォルトは Greedy です。最初に 10 文字を飲み込み、一致しないことを確認し、1 文字を吐き出し、一致することを確認します。
* Pattern.compile("(.{3,10}?)+[0-9]") が Reluctant になると、最初に 3 文字を飲み込み、不一致を見つけ、一致するまで飲み込み続け、0 を出力します。 5まで。
* Pattern.compile("(.{3,10}++)+[0-9]") が Possessive (排他的) の場合、最初に 10 文字を飲み込みますが、吐き出さない場合は一致しません。 、
※この方法は主に高効率が要求される場合に使用されます(誤差はあります)。
*/
if(m.find()) {
System.out.println(m.start() + "----" + m.end());
}それ以外 {
System.put.println("一致しません!");
}
14. 補足(非捕獲群)
次のようにコードをコピーします。
//非キャプチャ グループの意味は文字通りの意味とは逆で、一致する場合はキャプチャすることを意味します
パターン p = Pattern.compile("(?=a).{3}");
/*
* a66 を出力します。これは、a で始まるように要求することと同じです。 Pattern.compile("[a].{2}"); と記述することもできます。
* Pattern.compile(".{3}(?!=a)") が {2}[^a] で終わっていないが、次の文字が a (先読み) ではない場合、44a、66b が出力されます。この用法は一般的には使用されません。
※Pattern.compile(".{3}(?=a)")の場合は444を出力します(?=aが先読みのため) 前に置くとグループに含まれます。 、後ろに配置されている場合、グループには含まれません。
*
*
*/
文字列 s = "444a66b";
マッチャー m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
15. 後方参照
次のようにコードをコピーします。
パターン p = Pattern.compile("(//d//d)//1");
/*
* 出力は true、//1 は最初のグループと同じを意味します。1213 に変更すると誤りになります。
※Pattern.compile("(//d(//d))//2")の場合は122に変更する必要があります。
*
*/
文字列 s = "1212";
マッチャー m = p.matcher(s);
System.out.println(m.matches());
16. 旗の略称
「.」は改行に一致しません。「大文字と小文字を区別しない一致は、埋め込みフラグ式 (?i) によっても有効にすることができます」の略語である CASE_INSENSITIVE を覚えておいてください。