誰もが知っているように、プログラム開発では、文字列を一致させ、検索、交換し、判断する必要がある状況に遭遇することは避けられません。これらの状況は、より複雑になることがあります。純粋なエンコーディングで解決された場合、プログラマーの時間とエネルギーを無駄にすることがよくあります。したがって、正規表現を学び、使用することは、この矛盾を解決する主な手段となっています。
誰もが知っているように、正規表現は、パターンマッチングと交換に使用できる仕様です。正規表現は、普通の文字(文字AからZなど)と特殊文字(メタカラクター)で構成される文字通りのパターンです。文字通りのボディを検索するときに一致する1つ以上の文字列を説明するために使用されます。正規表現は、検索された文字列と文字パターンを一致させるテンプレートとして機能します。
JDK1.4がJava.util.regexパッケージを起動したため、優れたJava正規表現アプリケーションプラットフォームを提供してくれました。
正規表現は非常に複雑なシステムであるため、入門概念の例をいくつか紹介します。詳細については、関連する本を参照して、自分で探索してください。
// backslash
/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-End文字です
。条件付き /n以外の単一文字を制限します
Java ..条件制限がJavaの後、Newlineを除く2つの文字
特定の制限を追加する "[]"
[AZ]条件は、小文字AからZ範囲の文字に限定されています
[AZ]条件は、大文字のAからZ範囲の1つの文字に制限されています
[a-za-z]条件は、小文字Aからzまたは大文字のAからz範囲の文字に限定されています
[0-9]条件は、小文字0〜9の範囲の1つの文字に制限されています
[0-9A-Z]条件は、低細胞0〜9またはZ範囲に限定されています
[0-9 [AZ]]条件は小文字0〜9またはAからZの範囲(交差点)に限定されています
[]そして、制限条件「[^]」を再度追加します
[^az]条件は、非低速ケースAからzの範囲の文字に限定されています
[^az]条件は、非caps aからz範囲の1つの文字を制限します
[^a-za-z]条件は、非lowercase aからzまたはzからzの範囲の文字に限定されています
[^0-9]条件は、非lowercase 0〜9の範囲の1つの文字に制限されています
[^0-9a-z]条件は、非低速ケース0〜9またはaからzの範囲の文字に限定されています
[^0-9 [az]]条件は、非lowercase 0〜9またはaからzの範囲の文字に限定されています(交差点)
制限条件が0回以上表示されることである場合、「*」を使用できます。
j* 0 j以上
。* 0以上の文字
J.*DJおよびD任意の0文字
制限条件が特定の文字が複数回表示されることである場合、「+」を使用できます
j+ 1以上j
。+ 1以上の任意の文字
J.+DJとDの間の1つ以上の文字
制限条件が特定の文字が0回以上表示されるという場合、「?」使用できます。
JA? JまたはJAが表示されます
指定された数字「{a}」の連続的な発生に制限
J {2} JJ
j {3} jjj
テキスト以上のもの、および「{a、}」
j {3、} jjj、jjjjj、jjjjj、???(j共存3回以上)
複数のテキスト、b "{a、b}"未満のテキスト
j {3,5} jjjまたはjjjjまたはjjjjj
2つのうちの1つを取ります
j | ajまたはa
Java |こんにちはJavaまたはこんにちは
"()"は組み合わせタイプを指定します。たとえば、<a href =/"index.html/"> index </a>の間でデータを照会すると、<a。*href =/"。*/">(。+?)</a>を書くことができます。
pattern.compile関数を使用する場合、正規表現の一致する動作を制御するパラメーターを追加できます。
pattern pattern.compile(string regex、int flag)
フラグの値の範囲は次のとおりです。
pattern.canon_eq 2つのキャラクターの「標準分解」がまったく同じかどうかの場合にのみ、試合が決定されます。たとえば、このフラグを使用した後、「a/u030a」という式が「?」と一致します。デフォルトでは、「標準的平等」は考慮されません。
pattern.case_insensive(?i)デフォルトでは、case-uncentifiedのマッチングは、US-ASCII文字セットでのみ使用できます。このフラグにより、式はマッチングの場合のケースを無視できます。 Unicode文字を未知のサイズの一致させるには、Unicode_Caseとこのフラグを組み合わせるだけです。
pattern.comments(?x)このモードでは、式のマッチング時にスペース文字(正規表現)は無視されます(翻訳者の注:式では「// s」を参照するのではなく、スペース、タブ、キャリッジリターンなどを指します)。コメントは#から始まり、この行で終了します。 Unix行モードは、埋め込まれたフラグを介して有効にできます。
pattern.dotall(?s)このモードでは、式 '。'行を表すエンディング文字を含む、あらゆるキャラクターに一致させることができます。デフォルトでは、式「。」ラインのエンディング文字と一致しません。
pattern.multiline
(?m)このモードでは、 '^'と '$'はそれぞれ行の開始と終了と一致します。さらに、 '^'はまだ文字列の始まりと一致し、「$」は文字列の終わりも一致します。デフォルトでは、これらの2つの式は、文字列の開始と終了のみと一致します。
pattern.unicode_case
(?u)このモードでは、Case_Issensiveフラグも有効にする場合、Unicode文字を正体不明のケースと一致させます。デフォルトでは、Case-Assensive Matterは、US-ASCIIキャラクターセットでのみ使用できます。
pattern.unix_lines(?d)このモードでは、 '/n'のみがラインとマッチングの中断と見なされます。 '、'^'、および' $ '。
空の概念を脇に置いて、ここにいくつかの簡単なJavaの通常のユースケースがあります:
◆たとえば、文字列に検証が含まれている場合
// javaで始まり、ウィルパターン= pattern.compile( "^java。*")で終了する文字列を見つけます。 matcher matcher = pattern.matcher( "Javaは人間ではありません"); boolean b = matcher.matches(); //条件が満たされると、それはtrueを返します。
◆複数の条件で文字列を分割するとき
パターンパターン= pattern.compile( "[、|]+"); string [] strs = pattern.split( "java hello world java、hello ,, world | sun");
◆テキストの交換(キャラクターが初めて表示されます)
パターンパターン= pattern.compile( "正規式"); Matcher matcher = pattern.matcher( "正規表現Hello World、正規表現Hello World"); // Regularity System.out.println(matcher.ReplaceFirst( "Java"))に準拠する最初のデータを置き換えます。
◆テキスト交換(すべて)
パターンパターン= pattern.compile( "正規式"); matcher matcher = pattern.matcher( "正規表現Hello World、正規表現Hello World"); // remultive system.out.println(matcher.replaceall( "java"))に準拠した最初のデータを置き換えます。
◆テキスト置換(文字を置き換える)
パターンパターン= 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.compile( "[////-] +@( [////] +/.)+ [// w //-]+"、pattern.case_insensitive); matcher matcher = pattern.matcher(str); system.out.out.println(matcher.matches();
◆HTMLタグを削除します
パターンパターン= pattern.compile( "<。+?>"、pattern.dotall); matcher matcher = pattern.matcher( "<a href =/" index.html/"> home </a>"); string string = matcher.replaceall( ""); system.out.println(string);
◆HTMLで対応する条件文字列を見つけます
パターンパターン= pattern.compile( "href =/"(。+?)/""); matcher matcher = pattern.matcher( "<a href =/"> html/"> home </a>"); if(matcher.find())system.out.println(matcher.group(1);};}
◆http://アドレスをインターセプトします
// urlpattern pattern = pattern.compile( "(http:// | https://){1} [//w/.//./-/:]+"); matcher matcher = pattern.matcher( "dsdsds <http:// dsds // gfgffdfdfdfdf") while(matcher.find()){buffer.append(matcher.group()); buffer.append( "/r/n"); system.out.println(buffer.toString());}◆指定された{}漢字を交換します
string str = "Javaの現在の開発履歴は{0} Years -{1} years"; string [] [] [] object = {new String [] {"// {0 //}"、 "1995"}、new String [] {"// {1 //}"、 "2007"}}} sourcestring、object [] object){string temp = sourcestring; for(int i = 0; i <object.length; i ++){string [] result =(string [])object [i];パターンパターン= pattern.compile(result [0]); matcher matcher = pattern.matcher(temp); temp = matcher.replaceall(result [1]); } return temp;}◆定期的な条件を持つ指定されたディレクトリのファイルをクエリします
//ファイルリストをキャッシュするために使用されるprivate arraylist files = new ArrayList(); //ファイルパスプライベートストリング_pathをホストするために使用されます。 //未成年の通常のフォーミュラプライベートストリング_regexpをホストするために使用されます。クラスmyfilefilterを実装しますfilefilter { / ***ファイル名を一致します* / public boolean accept(file file){try {pattern pattern = pattern.compile(_regexp); matcher match = pattern.matcher(file.getName()); return match.matches(); } catch(例外e){return true; }}} / ***入力ストリームを分析* @param inputs* / filesanalyze(string path、string regexp){getFileName(Path、regexp); } /** *ファイル名を分析してファイルを追加 * @param input * /private void getFileName(string path、string regexp){// directory_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]); } 戻る; } / ***出力情報を表示* @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://"、 "[az |。]*"); }Javaの規則性には多くの機能があります。実際、文字処理である限り、規則性ができないことは何もありません。 (もちろん、定期的に説明するのに多くの時間がかかります||| ...)
上記は、Javaの正規表現を整理する情報です。今後も関連情報を追加し続けます。このサイトへのご支援ありがとうございます!