高度な正規表現の00 09Java

1つの理解正規表現

、文字列だけでなく、文字列の様々なサポート文字列処理動作としては非常に汎用性の高いタイプがある前に、ユーザー限り、そのプロジェクトの開発に、各データ型の機能への変換をサポートし、分析の一連見つけることができます基本的に表現文字列が入力した情報です。他のデータ型に変換する場合、単純にStringクラスのメソッドに依存しているのであれば、順序が多いいくつかの複雑な検証プロセスでなければならない、変換の精度を確保するために、この場合には、非常に面倒です。

今、あなたは、文字列要求は数字の文字列、桁数であれば数かどうかを決定し、それが掛け算になっていることを前提としています。
例:

package cn.victor.demo;

import java.text.NumberFormat;
import java.text.ParseException;

public class DateDemo {

	public static void main(String[] args) throws ParseException {
		String str = "123";
		if(isNumber(str)) {
			long n = Integer.parseInt(str);
			System.out.println(n * 2);
		}
		
	}
	
	public static boolean isNumber(String str) {
		char[] chars = str.toCharArray();
		for(int i = 0; i < chars.length; i++) {
			if( chars[i] < '0' || chars[i] > '9' ) {
				return false;
			}
		}
		
		return true;
	}
}


この検証機能は、実際には非常に簡単ですが、これは、このような単純な関数である、それは、より複雑な検証で、その後場合は、書き込みアプリケーションロジックのコードに多くの開発者を取りますか?したがって、この場合には、ベストプラクティスの条件を確認するためには、完了するために正規表現を使用することです。
例:同じ効果を達成するために正規表現を使用

package cn.victor.demo;

import java.text.NumberFormat;
import java.text.ParseException;

public class DateDemo {

	public static void main(String[] args) throws ParseException {
		String str = "123";
		if(str.matches("\\d+")) {
			long n = Integer.parseInt(str);
			System.out.println(n * 2);
		}
		
	}
}


もともとPerlの進化言語、あなたは正規表現の定義を使用する必要があるならば、JDK 1.4で、それだけでは、他のjarファイルを導入する必要がある前に、しかし、通常のJDK 1.4は、暗黙のうちにJDKてきた後からの正規表現サポート、およびStringクラスに固有のもいくつかの変更を加えながら、のjava.util.regex開発パッケージが設けられているので、直接定期的なプロセスをサポートする方法があります。

通常の最大の特徴を使用すると、検証プロセス、改質処理を容易にするため、複雑な文字列を容易にすることです。

一般的な数字2正規

それは、通常の処理操作を実行することであれば、一般的に使用される通常のマーカーにも最初のニーズは、JDK 1.4の初めから、習得したが、このプログラムでのjava.util.regex開発パッケージ、パターンのクラスを提供し、このパッケージ、クラスを提供しますこれは、すべての定期的なマークの定義をサポートしてきました。
(1)[番号:単一文字の一致]
| -任意の文字:任意の文字で表さ
| - \\マッチ"\";
| - \nマッチ改行;
| - \tマッチングタブ;
(2)[数:(必要に応じて文字からであってもよい)は、単一の文字セットは]
| - :[abc]手紙を示してもよく、B、Cは任意の文字であり、
| - :[\^abc]任意の文字A、Bを表していない、cは;
| - [a-zA-Z]任意の大文字と小文字を区別しないで構成される文字で表され;
| - [0-9]数字で表します。
(3)[数:単一簡略化キャラクタ・セット]
| - .任意の文字を表し、
| - \d範囲に相当し[0-9];
| - \D範囲に相当し[^0-9];
| - \s:、スペースのいずれかに一致;スペース、改行、タブであってもよい
- | \S任意の非空間データに一致する;:
| - \w一致する文字、数字、下線、に相当します[a-zA-Z_0-9]
| - \Wと同等の非一致文字、数字、アンダースコア、[^a-zA-Z_0-9];
(4)境界マッチング
| - ^マッチング境界線が始まった;
| - $試合が終わった境界;
(5)数のみで追加デフォルトで表示彼らは文字の数を一致させることができる前に、ユニットの数。
?| -の式:正則が0または1回発生する可能性があります。
| - *式:正、ゼロ、一回以上発生することがあり、
| - +式:正のは、一回以上発生することがあり、
| - } {N-式:式の長さ正確にn回;
:; | -式{N}の長さの表現である少なくともn回
;倍の発現の長さN〜M:| -式{N、M}
論理式(6)タイプ:あなたが定期的に複数接続することができます:
| -表現式Y X:X式はY式の後に続きます。
| -式X | Yの式:式を満たすが存在する場合があります。
| - (式):全体が表現設定として記述されている、あなたは全体の説明のために単位数を設定することができます。

正規のための3 Stringクラスのサポート

実行正規表現のプロセスは、ほとんどの場合、文字列クラスに基づいて行われますし、Stringクラスで、次の操作方法を備えています。

番号。 メソッド名 タイプ 説明
01 パブリックブールマッチ(文字列の正規表現) 一般 指定された通常の文字列の決意
02 公共の文字列でReplaceAll(文字列の正規表現、文字列置換) 一般 すべて置換
03 公共の文字列が置き換え(文字oldChar、文字newCharに) 一般 最初に交換してください
04 パブリック文字列[]スプリット(文字列の正規表現) 一般 定期的なスプリット
05 パブリック文字列[]スプリット(文字列の正規表現、INT限界) 一般 定期的なスプリット

定期的に使用する上で取得するには、いくつかの具体的な例を以下で説明します。
例:代替実装(削除英数字以外の)文字列

package cn.victor.demo;

public class DateDemo {

	public static void main(String[] args) {
		String str = "328d$%$(fdf32(*&c34f34c24334gfg34c324c&crfgdsfg^%^$324csdsd##";
		String replstr = str.replaceAll("[^a-zA-Z0-9]", "");
		System.out.println(replstr);
		
	}
}


例:分割するための文字列(数によって分割)

package cn.victor.demo;

public class DateDemo {

	public static void main(String[] args) {
		String str = "328d$%$(fdf32(*&c34f34c24334gfg34c324c&crfgdsfg^%^$324csdsd##";
		String replstr[] = str.split("\\d+");
		for(int i = 0; i < replstr.length; i++) {
			System.out.println(replstr[i]);
		}
		
	}
}


比較的容易な分割の交換の動作のための場合は、通常のプロセスが、問題は、データ検証部でした。
例:それは2倍になる場合、データは小数点であるかどうかを決定する、小数は次にです

package cn.victor.demo;

public class DateDemo {

	public static void main(String[] args) {
		String str = "23";
		System.out.println(str.matches("\\d+(\\.\\d+)?"));
	}
}


例:日付をDate型で構成されている場合、日付からなる文字列は、それがに変換されるかどうかを決定します

package cn.victor.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateDemo {

	public static void main(String[] args) throws ParseException {
		String str = "1999-08-21";
		if(str.matches("\\d{4}-\\d{2}-\\d{2}"))
		{
			System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
		}
	}
}


定期的に特定の意味は、フォーマットのための処理のみ決意を決定することはできません。
例:指定した電話番号が正しいかどうかを判断しますか?
(1)電話番号: \\d{7,8}51283346、;
(2)電話番号: (\\d{3,4})?\\d{7,8}01051283346、;
(3)電話番号:(010) ((\\d{3,4})|(\\(\\d{3,4}\\))-)?\\d{7,8}-51283346、 。

package cn.victor.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateDemo {

	public static void main(String[] args) throws ParseException {
		String str = "(010)-5128331";
		System.out.println(str.matches("((\\d{3,4})|(\\(\\d{3,4}\\)))?-?\\d{7,8}"));
	}
}


今定期的に確認するために使用することができ、その後、次の検証、電子メールアドレスの形式を実装するためにそれを使用することができます。
例:電子メールの形式を確認し
(図1)は、電子メールユーザ名を形成することができる字母数字_、構成
(2)電子メールドメインを形成することができる字母数字_-、構成
サフィックス(3)ドメイン名がなければならない.cn:です.com.net.com.cn.gov、。

package cn.victor.demo;

public class DateDemo {

	public static void main(String[] args) {
		String str = "[email protected]";
		System.out.println(str.matches("[^_]\\w+@[\\w-]+\\.(com|cn|com.cn|edu|gov)"));
	}
}


今、いくつかの定期的なマッチング処理操作は治療の最も一般的な形式であることをいくつかあります。

4のjava.util.regex・サポート・パッケージ

ほとんどの場合、あなたは定期的な操作を実現するためにStringクラスを使用することができますが、いくつかのケースがありますが、二つのクラス定義されたこのパッケージでのjava.util.regex開発を提供し、通常の処理クラスのパッケージを使用する必要があります。Pattrenを(正規表現コンパイラ)、マッチャ(試合)。
図1に示すように、パターンクラス
(1)パターンクラスは、正規表現を処理するコンパイルするためのサポートを提供しますpublic static Pattern compile​(String regex);
(2)また、支持文字列分割操作を備えています。public String[] split​(CharSequence input)

package cn.victor.demo;

import java.util.regex.Pattern;

public class DateDemo {

	public static void main(String[] args) {
		String str = "1s2s3s4";
		Pattern pat = Pattern.compile("s");
		String[] resultset = pat.split(str);
		for(int i = 0; i < resultset.length; i++) {
			System.out.println(resultset[i]);
		}
	}
}


図2に示すように、このクラスのオブジェクトの実装処理正則マッチングインスタンスが完了したパターンクラスに依存していることをマッチャークラス。
(1)Methodパターンのクラスが用意されています。public Matcher matcher​(CharSequence input)
このクラスのメソッドを使用して、以下のように取得されたオブジェクトクラスが進む整合することができる場合:
(1)定期的な一致:public boolean matches()

package cn.victor.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateDemo {

	public static void main(String[] args) {
		String str = "123";
		Pattern pat = Pattern.compile("\\d+");
		Matcher mac = pat.matcher(str);
		System.out.println(mac.matches());
	}
}


(2)置換文字列:public String replaceAll​(String replacement)

package cn.victor.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateDemo {

	public static void main(String[] args) {
		String str = "1s2s3";
		Pattern pat = Pattern.compile("s");
		Matcher mac = pat.matcher(str);
		System.out.println(mac.replaceAll(""));
	}
}


それは純粋に分割に基づいている場合は、交換する、3つの操作に合わせ、例えば、達成することができ、Stringクラスにのみ依存する、のjava.util.regex開発キットを使用することはありません。しかし、そこに機能をグループ化するのMatcherクラスを提供し、このパケットの機能は、文字列では利用できません。

package cn.victor.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateDemo {

	public static void main(String[] args) {
		String str = "select * from table values(#{dept},#{no},#{name})";
		Pattern pat = Pattern.compile("#\\{\\w+\\}");
		Matcher mac = pat.matcher(str);
		while(mac.find()) {
			System.out.println(mac.group(0).replaceAll("\\W+", ""));
		}
	}
}


行わない場合のjava.util.regex開発キットは、より複雑な定期的な治療の一部を使用することは困難であり、Stringクラスによって提供される機能は、通常の基本的な操作に適しているだけです。

公開された87元の記事 ウォン称賛11 ビュー2989

おすすめ

転載: blog.csdn.net/weixin_43762330/article/details/104770176