Java正規表現が複数行一致

9702 ワード

デフォルトでは.*に表示されます.外の文字しか一致しません.一致する文字列に折り返し改行(複数行)が含まれている場合は、正規表現が改行に遭遇すると停止し、折り返し改行を含む列が正しく一致しないため、解決策は次のとおりです.
1.PatternオブジェクトとMatcherオブジェクトの使用
Patternモードを:Patternに設定.DOTALL
2、Stringを使用する.replaceAll()
正規表現の書き方:
String reg = "(?s)'.*'";
次に、リターン改行文字を含む正規表現置換処理例を示します.
	static String teststr = "UAPPROJECT_ID='402894cb4833decf014833e04fd70002 ; 
\r */' select "; /** * */ public void testa(){ Pattern wp = Pattern.compile("'.*?'", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Matcher m = wp.matcher(teststr); String result = m.replaceAll(""); System.out.println("result:" + result); } /** * */ public void testb(){ String result = teststr.replaceAll("(?s)'.*?'", ""); System.out.println("result:" + result); }

参照先:
Java正規表現の機能と応用
作者:フォント:[増加減少]タイプ:転載
jdk 1から4 javaをリリースします.util.regexパッケージは、Java正規表現が複雑なシステムであるため、Java正規表現アプリケーションプラットフォームを提供しています.
正規表現とは、あるパターンで文字列を一致させる式です.正規表現は、いくつかの一般文字といくつかのメタ文字で表されます.(metacharacters)で構成されています.通常の文字には大文字と小文字のアルファベットと数字が含まれていますが、メタ文字には特別な意味があります..NetプラットフォームでもJavaプラットフォームでも、正規表現の意味は同じです.Java正規表現の機能と具体的な応用を主に分析し、参考にしてください.jdk 1.4からjava.uが発売されました.til.regexパッケージは、Java正規表現が複雑なシステムであるため、Java正規表現アプリケーションプラットフォームを提供しています.\スラッシュt間隔('09')改行('A')rリターン('D')d数字等価[0-9]D非数値等価[^0-9]s空白記号[tx 0 Bfr]S非空白記号[^tx 0 Bfr]w単独文字[a-zA-Z_0-9]W非単独文字[^a-zA-Z_0-9]Wf改ページ子e Escapeb単語の境界B単語以外の境界Gの前の一致の終了^を制限先頭^java条件をJavaを先頭文字$を制限末尾java$条件をjavaを末尾文字に制限.条件制限以外の任意の個別文字java..条件はjavaに制限された後、改行を除く任意の2文字に特定の制限条件「[]」[a-z]を加える条件小文字a to zの範囲に制限1文字[A-Z]条件大文字A to Zの範囲に制限1文字[a-zA-Z]条件小文字a to zまたは大文字A to Zの範囲に制限1文字[0-9]条件小文字0 to 9の範囲に1文字[0-9 a-z]を制限する条件付き小文字0 to 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-zA-Z]条件制限非小文字a to zまたは大文字A to Zの範囲の1文字[^0-9]条件制限非小文字0 to 9の範囲の1文字[^0-9 a-z]条件制限非小文字0 to 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{3}JJJJ文字a個以上連続出現し、かつ「{a,}」J{3,}JJJJ,JJJJJJJ,JJJJJJJ,??(3回以上J併存)文字以上、b個以下「{a,b}」J{3,5}JJJJまたはJJJJJJの両方から「|」J|A JまたはA Java|Hello JavaまたはHello「()」の組み合わせタイプを指定します.例えば、indexの間のデータを調べて、(.+?)と書くことができます.Patternを使っています.compile関数には、Java正規表現のマッチング動作を制御パラメータ:Pattern Patternを加えることができる.compile(String regex,int flag)flagの値範囲は以下の通りである:Pattern.CANON_EQは、2文字の「正規分解(canonical decomposition)」が完全に同じである場合にのみ、一致を認定する.たとえば、このフラグを使用すると、式「au 030 A」が「?」に一致します.デフォルトでは、「仕様同等性(canonical equivalence)」は考慮されません.Pattern.CASE_INSENSITIVE(?i)
デフォルトでは、大文字と小文字の不明な一致は、US-ASCII文字セットにのみ適用されます.このフラグは、式を大文字と小文字を無視して一致させることができます.Unicode文字の大きさが不明なマッチングを行うには、UNICode_CASEはこのマークと合わせればいいです.
Pattern.COMMENTS(?x)このモードでは、マッチング時にJava正規表現のスペース文字は無視されます(訳者注:表現の「\s」ではなく、表現のスペース、tab、リターンなどを指します).コメント#から、この行が終わるまで.Unix行モードは、埋め込みフラグで有効にできます.Pattern.DOTALL(?)このモードでは、式'.'行を表す終了文字を含む任意の文字を一致させることができます.デフォルトでは、式'.'行の終端に一致しません.Pattern.MULTILINE(?m)このモードでは,'^'と'$'はそれぞれ1行の開始と終了に一致する.また、'^'は文字列の開始に一致し、'$'も文字列の終了に一致します.デフォルトでは、この2つの式は文字列の開始と終了にのみ一致します.Pattern.UNICODE_CASE(?u)このモードでCASEを有効にした場合INSENSITIVEフラグは、Unicode文字に対して大文字と小文字の不明感のマッチングを行います.デフォルトでは、大文字と小文字の不感な一致は、US-ACCI文字セットにのみ適用されます.Pattern.UNIX_LINES(?d)このモードでは、「一行の中止と認められ、'.','^',および'$'をマッチングします.空っぽの概念を捨てて、以下にいくつかの簡単な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 System.out.println(strs[i]);
}

テキスト置換(最初の文字)
 
   
Pattern pattern = Pattern.compile("Java ");
Matcher matcher = pattern.matcher("Java Hello World, Hello World");
//
System.out.println(matcher.replaceFirst("Java"));

テキスト置換(すべて)
 
   
Pattern pattern = Pattern.compile("Java ");
Matcher matcher = pattern.matcher("Java Hello World, Hello World");
//
System.out.println(matcher.replaceAll("Java"));

テキスト置換(置換文字)
 
   
Pattern pattern = Pattern.compile("Java ");
Matcher 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());

メールアドレスであることを確認
 
   
String str="[email protected]";
Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());

htmlタグの削除
 
   
Pattern pattern = Pattern.compile("<.>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("ホームページ");
String string = matcher.replaceAll("");
System.out.println(string);

html内の対応条件文字列の検索
 
   
Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("ホームページ");
if(matcher.find())
System.out.println(matcher.group(1));
}

◆http://アドレスの切り取り
コード#コード#
 
   
// url
Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");
Matcher matcher = pattern.matcher("dsdsdsfdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("\r
");
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 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正規表現の機能はまだまだたくさんありますが、実際には文字処理であれば正規ではできないことはありません.