java正則表達式

JAVA正則表達式                                                                  

正則表達式包含特殊字符 在java中使用需要加'\'進行轉義

如 \d 匹配任意一個數字字符(相當於[0-9]) java使用需要寫成\\d

^\\d[05] 匹配  以數字開頭第二位是0或者5 的字符串

^\\d[05]  與 ^[0-9][05] 等價;{n}表示指定字符出現次數; {n,}表示指定字符至少出現n次;{n,m} m大於n 表示至少出現n次最多出現m次

注意: ? 該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字符串,而默認的貪婪模式則儘可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。

[email protected]

要匹配上面的郵箱

前面的字符可能出現很多次,字符後面@前面可能有數字出現

^[a-zA-Z0-9]+ \\d@[a-zA-Z0-9]+\\.[com]+[cn]?

^[a-zA-Z0-9]*\\d

^[a-zA-Z0-9]{0,}\\d

另一個例子:

如果要匹配輸入的字符只能是由數字或字母組成 java正則表達式有幾種寫法

1、\\d*\\w*\\W*

2、^[0-9a-zA-Z]{0,}或者^[0-9a-zA-Z]*

第二種如果不寫{0,}或者*表示只校驗一個字符,大於一個字符無論是純數字純字母都無法校驗

[email protected]

[email protected]

要同時匹配以上兩個郵箱要咋搞


\\d+@[a-zA-Z0-9]+\\.[com]+

Pattern p =Pattern.compile("\\d+@[a-zA-Z0-9]+\\.[com]+");

String Str="[email protected]@[email protected]";

Matcher m=p.matcher(Str);

while(m.find()){

   list.add(m.group());

}

匹配結果:

[[email protected], [email protected], [email protected]]

java正則校驗格式:

Pattern p =Pattern.compile("regexStr");

Matcher match=p.matcher(Str);//str爲待匹配的字符串

boolean flag=match. matches();// 返回布爾型 表示匹配結果,是否匹配成功

java正則髒話替換 前提要有髒話庫

Pattern p =Pattern.compile("[\u65e5\u5988\u903c]+");

String Str="啊哈ifi啊送花給掐日死發揮阿媽斯哦對逼宏觀if";

Matcher m=p.matcher(Str);

StringBuffer sb = new StringBuffer();

Str= m.replaceAll("*");

java正則髒話替換 詞組替換


Pattern p =Pattern.compile("(([\u4f60][\u5988])|([\u5988][\u903c]))");

String Str="啊哈ifias打你媽掃打掃as打發嘎的啊送花給掐你日死發揮阿媽斯哦對媽逼宏觀if";

Matcher m=p.matcher(Str);

StringBuffer sb = new StringBuffer();

Str= m.replaceAll("*");

java正則去除中文

//去除漢字
String string="阿斯達斯asjjjjj-愛仕達晚上吃啥發放";
Pattern pattern=Pattern.compile("[\u4e00-\u9fa5]");
Matcher matcher=pattern.matcher(string);
String result=matcher.replaceAll("");
System.out.println(result);

 

正則表達式語法

元字符

描述

\

將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當於多種編程語言中都有的“轉義字符”的概念。

^

匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之後的位置。

$

匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表達式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等價於{0,}。

+

匹配前面的子表達式一次或多次(大於等於1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。

?

匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。

{n}

n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。

{n,}

n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

{n,m}

m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。

?

當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字符串,而默認的貪婪模式則儘可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。

.點

匹配除“\r\n”之外的任何單個字符。要匹配包括“\r\n”在內的任何字符,請使用像“[\s\S]”的模式。

(pattern)

匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。

(?:pattern)

匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。

(?=pattern)

正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。

(?!pattern)

正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

(?<=pattern)

反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?<!pattern)

反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

x|y

匹配x或y。例如,“z|food”能匹配“z”或“food”或"zood"(此處請謹慎)。“(z|f)ood”則匹配“zood”或“food”。

[xyz]

字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz]

負值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

[a-z]

字符範圍。匹配指定範圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字符。

注意:只有連字符在字符組內部時,並且出現在兩個字符之間時,才能表示字符的範圍; 如果出字符組的開頭,則只能表示連字符本身.

[^a-z]

負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字符。

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B

匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\cx

匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。否則,將c視爲一個原義的“c”字符。

\d

匹配一個數字字符。等價於[0-9]。

\D

匹配一個非數字字符。等價於[^0-9]。

\f

匹配一個換頁符。等價於\x0c和\cL。

\n

匹配一個換行符。等價於\x0a和\cJ。

\r

匹配一個回車符。等價於\x0d和\cM。

\s

匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。

\S

匹配任何可見字符。等價於[^ \f\n\r\t\v]。

\t

匹配一個製表符。等價於\x09和\cI。

\v

匹配一個垂直製表符。等價於\x0b和\cK。

\w

匹配包括下劃線的任何單詞字符。類似但不等價於“[A-Za-z0-9_]”,這裏的"單詞"字符使用Unicode字符集。

\W

匹配任何非單詞字符。等價於“[^A-Za-z0-9_]”。

\xn

匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲確定的兩個數字長。例如,“\x41”匹配“A”。“\x041”則等價於“\x04&1”。正則表達式中可以使用ASCII編碼。

\num

匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字符。

\n

標識一個八進制轉義值或一個向後引用。如果\n之前至少n個獲取的子表達式,則n爲向後引用。否則,如果n爲八進制數字(0-7),則n爲一個八進制轉義值。

\nm

標識一個八進制轉義值或一個向後引用。如果\nm之前至少有nm個獲得子表達式,則nm爲向後引用。如果\nm之前至少有n個獲取,則n爲一個後跟文字m的向後引用。如果前面的條件都不滿足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。

\nml

如果n爲八進制數字(0-7),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。

\un

匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(&copy;)。

\< \> 匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\<the\>能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。
\( \) 將 \( 和 \) 之間的表達式定義爲“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。
| 將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。
+ 匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。
? 匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。
{i} {i,j}

匹配指定數目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]{3} 能夠匹配字符"A"後面跟着正好3個數字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]{4,6} 匹配連續的任意4個、5個或者6個數字

Matcher 類的方法

索引方法

索引方法提供了有用的索引值,精確表明輸入字符串中在哪能找到匹配:

序號 方法及說明
1 public int start() 
返回以前匹配的初始索引。
2 public int start(int group)
 返回在以前的匹配操作期間,由給定組所捕獲的子序列的初始索引
3 public int end()
返回最後匹配字符之後的偏移量。
4 public int end(int group)
返回在以前的匹配操作期間,由給定組所捕獲子序列的最後字符之後的偏移量。

研究方法

研究方法用來檢查輸入字符串並返回一個布爾值,表示是否找到該模式:

序號 方法及說明
1 public boolean lookingAt() 
 嘗試將從區域開頭開始的輸入序列與該模式匹配。
2 public boolean find() 
嘗試查找與該模式匹配的輸入序列的下一個子序列。
3 public boolean find(int start)
重置此匹配器,然後嘗試查找匹配該模式、從指定索引開始的輸入序列的下一個子序列。
4 public boolean matches() 
嘗試將整個區域與模式匹配。

替換方法

替換方法是替換輸入字符串裏文本的方法:

序號 方法及說明
1 public Matcher appendReplacement(StringBuffer sb, String replacement)
實現非終端添加和替換步驟。
2 public StringBuffer appendTail(StringBuffer sb)
實現終端添加和替換步驟。
3 public String replaceAll(String replacement) 
 替換模式與給定替換字符串相匹配的輸入序列的每個子序列。
4 public String replaceFirst(String replacement)
 替換模式與給定替換字符串匹配的輸入序列的第一個子序列。
5 public static String quoteReplacement(String s)
返回指定字符串的字面替換字符串。這個方法返回一個字符串,就像傳遞給Matcher類的appendReplacement 方法一個字面字符串一樣工作。

start 和 end 方法

下面是一個對單詞 "cat" 出現在輸入字符串中出現次數進行計數的例子:

RegexMatches.java 文件代碼:

import java.util.regex.Matcher;
importjava.util.regex.Pattern;
public class RegexMatches{
	private static final String REGEX ="\\bcat\\b";
	private static final String INPUT ="cat cat cat cattie cat";
	public static void main(Stringargs[]){
		Patternp=Pattern.compile(REGEX);
		Matcherm=p.matcher(INPUT);
		//獲取 matcher 對象
		intcount=0;
		while(m.find()){
			count++;
			System.out.println("Match number  "+count);
			System.out.println("start():"+m.start());
			System.out.println("end():"+m.end());
			}
		}
	}

以上實例編譯運行結果如下:

Match number 1
start(): 0end(): 3Match number 2
start(): 4end(): 7Match number 3
start(): 8end(): 11Match number 4
start(): 19end(): 22

可以看到這個例子是使用單詞邊界,以確保字母 "c" "a" "t" 並非僅是一個較長的詞的子串。它也提供了一些關於輸入字符串中匹配發生位置的有用信息。

Start 方法返回在以前的匹配操作期間,由給定組所捕獲的子序列的初始索引,end 方法最後一個匹配字符的索引加 1。

matches 和 lookingAt 方法

matches 和 lookingAt 方法都用來嘗試匹配一個輸入序列模式。它們的不同是 matcher 要求整個序列都匹配,而lookingAt 不要求。

lookingAt 方法雖然不需要整句都匹配,但是需要從第一個字符開始匹配。

這兩個方法經常在輸入字符串的開始使用。

我們通過下面這個例子,來解釋這個功能:

RegexMatches.java 文件代碼:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches{
	private static final String REGEX ="foo";
	private static final String INPUT ="fooooooooooooooooo";
	private static final String INPUT2 ="ooooofoooooooooooo";
	private static Pattern pattern;
	private static Matcher matcher;
	private static Matcher matcher2;
	public static void main(Stringargs[]){
		pattern=Pattern.compile(REGEX);
		matcher=pattern.matcher(INPUT);
		matcher2=pattern.matcher(INPUT2);
		System.out.println("Current REGEX is: "+REGEX);
		System.out.println("Current INPUT is: "+INPUT);
		System.out.println("Current INPUT2 is:  "+INPUT2);
		System.out.println("lookingAt():"+matcher.lookingAt());
		System.out.println("matches():"+matcher.matches());
		System.out.println("lookingAt():"+matcher2.lookingAt());
		}
	}

以上實例編譯運行結果如下:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
Current INPUT2 is: ooooofoooooooooooo
lookingAt(): true
matches(): false
lookingAt(): false

replaceFirst 和 replaceAll 方法

replaceFirst 和 replaceAll 方法用來替換匹配正則表達式的文本。不同的是,replaceFirst 替換首次匹配,replaceAll 替換所有匹配。

下面的例子來解釋這個功能:

RegexMatches.java 文件代碼:

import  java.util.regex.Matcher;
importjava.util.regex.Pattern;
public class RegexMatches{
	private static String REGEX="dog";
	private static String INPUT="The dog says meow."+"All dogs say meow.";
	private static String REPLACE="cat";
	public static void main(String[]args){
		Patternp= Pattern.compile(REGEX);
		//get a matcher object
		Matcherm= p.matcher(INPUT);
		INPUT=m.replaceAll(REPLACE);
		System.out.println(INPUT);}
	}

以上實例編譯運行結果如下:

The cat says meow. All cats say meow.

appendReplacement 和 appendTail 方法

Matcher 類也提供了appendReplacement 和 appendTail 方法用於文本替換:

看下面的例子來解釋這個功能:

RegexMatches.java 文件代碼:

import  java.util.regex.Matcher;
importjava.util.regex.Pattern;
public class RegexMatches{
	private static String REGEX="a*b";
	private static String INPUT="aabfooaabfooabfoob";
	private static String REPLACE="-";
	public static void main(String[]args){
		Patternp= Pattern.compile(REGEX);
		//獲取 matcher 對象
		Matcherm= p.matcher(INPUT);
		StringBuffersb=newStringBuffer();
		while(m.find()){
			m.appendReplacement(sb,REPLACE);
			}
		m.appendTail(sb);
		System.out.println(sb.toString());
		}
	}

以上實例編譯運行結果如下:

-foo-foo-foo-

PatternSyntaxException 類的方法

PatternSyntaxException 是一個非強制異常類,它指示一個正則表達式模式中的語法錯誤。

PatternSyntaxException 類提供了下面的方法來幫助我們查看發生了什麼錯誤。

序號 方法及說明
1 public String getDescription()
獲取錯誤的描述。
2 public int getIndex() 
 獲取錯誤的索引。
3 public String getPattern() 
獲取錯誤的正則表達式模式。
4 public String getMessage() 
返回多行字符串,包含語法錯誤及其索引的描述、錯誤的正則表達式模式和模式中錯誤索引的可視化指示。
發佈了38 篇原創文章 · 獲贊 51 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章