Java String 方法 matches的使用及正則表達式

用以記錄工作中遇到的離散知識。(190221)

一、String 方法 matches的使用。
boolean matches(String regex):
matches() 方法用於檢測字符串是否匹配給定的正則表達式。

調用此方法的 str.matches(regex) 形式與以下表達式產生的結果完全相同:

Pattern.matches(regex, str)

語法:

public boolean matches(String regex)

參數:
regex – 匹配字符串的正則表達式。

返回值:
在字符串匹配給定的正則表達式時,返回 true。

實例:

public class Demo1 {
    public static void main(String[] args){
        String Str = new String("我是一隻小小鳥");

        System.out.println("返回值 :"+Str.matches("(.*)一隻(.*)"));

        boolean flag = Str.matches("我是(.*)");
        if(flag){
            System.out.println("我被重新定義爲:HelloWord!");
        }else{
            System.out.println("我沒有被重新定義!");
        }
    }
}

以上程序執行結果爲:

返回值 :true
我被重新定義爲:HelloWord!

二、延伸 – 正則表達式
2.1 常見的符號的介紹

符號 說明
\d 數字:[0-9]
\D 非數字:等同於 [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
\ 將下一字符標記爲特殊字符、文本、反向引用或八進制轉義符。
例如,“n"匹配字符"n”。"\n"匹配換行符。序列"\\“匹配”\","\(“匹配”("。
* 等價於{0,} 匹配0至多個在它之前的字符。
例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。正則表達式 “.*” 意味着能夠匹配任意字符串。
+ 等價於{1,} 匹配前面的子表達式一次或多次。例如正則表達式9+匹配9、99、999等。
? 等價於{0,1}匹配前面的子表達式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。
此元字符還有另外一個用途,就是表示非貪婪模式匹配。
{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?’。注意:您不能將空格插入逗號和數字之間。
. 匹配除"\r\n"之外的任何單個字符。若要匹配包括"\r\n"在內的任意字符,請使用諸如"[\s\S]"之類的模式。
() 將 () 之間括起來的表達式定義爲“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域。
這個元字符在字符串提取的時候非常有用。捕獲組可以通過從左到右計算其開括號來編號。
(\d) 第一組
((A)(B©)) 第一組 ((A)(B©)) 第二組 (A) 第三組(B©) 第四組©

符號:x|y
說明:匹配 x 或 y。例如,‘z|food’ 匹配"z"或"food"。’(z|f)ood’ 匹配"zood"或"food"。

2.2 邊界匹配符號

符號 說明
^ 匹配輸入字符串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與"\n"或"\r"之後的位置匹配。
$ 匹配輸入字符串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"之前的位置匹配。
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾

2.3 其他常見符號

[]的使用 說明
[] 匹配括號中的任何一個字符
[abc] a、b 或 c(簡單類)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
()的使用 說明
(\d) 第一組
((A)(B©)) 第一組 ((A)(B©)) 第二組 (A) 第三組(B©) 第四組©

()的使用 – 組
說明:將 () 之間括起來的表達式定義爲“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域,這個元字符在字符串提取的時候非常有用。捕獲組可以通過從左到右計算其開括號來編號。

三、常見的使用方法
3.1 test()方法:檢索字符串中指定的值,返回true 或 false;測試是否存在。
語法:rgexp.test(str);
eg:

 var str = "abcedg";
 var reg = "/a/i";
alert(reg.test(str));     //true

3.2 exec()方法:用正則表達式模式在字符串中運行查找,並返回包含該查找結果的一個數組。
語法:rgExp.exec(str);

四、與字符串配合常見的使用方法

4.1 search()方法;檢索與正則表達式相匹配的值
返回與正則表達式查找內容匹配的第一個子字符串的位置。如果返回 -1 表示沒有匹配到。
語法:stringObj.search(rgExp);
eg1:

var str = "acbgdjgl";
alert(str.search("h"));      //-1

eg2:

var r, re;                   		// 聲明變量。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i;            			// 創建正則表達式模式。
r = s.search(re);           	 // 查找字符串。

4.2 match() 方法:使用正則表達式模式對字符串執行查找,並將包含查找的結果作爲數組返回。
語法:stringObj.match(rgExp);
eg:

var str='sdf e443 fedef 55 66gg 333322312 dff 99';
var re=/\d+/g;
alert(str.match(re)); 

4.3 replace()方法:返回根據正則表達式進行文字替換後的字符串的複製。
語法:stringObj.replace(rgExp, replaceText);
eg1:

var str='abacdAef';
alert(str.replace(/a/gi, 'T'));

eg2:

 var r, re;                      // 聲明變量。
 var ss = "The rain in Spain falls mainly in the plain.";
 re = /(\S+)(\s+)(\S+)/g;        // 創建正則表達式模式。
 r = ss.replace(re, "$3$2$1");   // 交換每一對單詞。

4.4 split()方法:將一個字符串分割爲子字符串,然後將結果作爲字符串數組返回。
語法:stringObj.split([separator[, limit]]);
eg:

var str='abc-12-u-qw';
var arr=str.split('-');
// [abc,12,u,qw]

五、常用正則表達式大全!(例如:匹配中文、匹配html)

5.1常見匹配

匹配 評註
匹配中文字符的正則表達式: [u4e00-u9fa5] 匹配中文還真是個頭疼的事,有了這個表達式就好辦了
匹配雙字節字符(包括漢字在內):[^x00-xff] 可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
匹配空白行的正則表達式:ns*r 可以用來刪除空白行
匹配Email地址的正則表達式:w+([-+.]w+)@w+([-.]w+).w+([-.]w+)* 表單驗證時很實用
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):1[a-zA-Z0-9_]{4,15}$ 表單驗證時很實用
匹配國內電話號碼:d{3}-d{8} d{4}-d{7}
匹配騰訊QQ號:[1-9][0-9]{4,} 騰訊QQ號從10000開始
匹配中國郵政編碼:[1-9]d{5}(?!d) 中國郵政編碼爲6位數字
匹配身份證:d{15} d{18}
匹配ip地址:d+.d+.d+.d+ 提取ip地址時有用

匹配HTML標記的正則表達式:<(S*?)[^>]>.?|<.*? />
評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力

匹配首尾空白字符的正則表達式:^s*|s*$
評註:可以用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),非常有用的表達式

5.2 匹配特定數字:

匹配 註解
^[1-9]d*$ 匹配正整數
^-[1-9]d*$ 匹配負整數
^-?[1-9]d*$ 匹配整數
^[1-9]d*|0$ 匹配非負整數(正整數 + 0)
^-[1-9]d*|0$ 匹配非正整數(負整數 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ 匹配正浮點數
^-([1-9]d*.d*|0.d*[1-9]d*)$ 匹配負浮點數
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ 匹配浮點數
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ 匹配非負浮點數(正浮點數 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮點數(負浮點數 + 0)

提示: 處理大量數據時有用,具體應用時注意修正
  
5.3 匹配特定字符串:

匹配 註解
^[A-Za-z]+$ 匹配由26個英文字母組成的字符串
^[A-Z]+$ 匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ 匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ 匹配由數字和26個英文字母組成的字符串
^w+$ 匹配由數字、26個英文字母或者下劃線組成的字符串

5.4 在使用RegularExpressionValidator驗證控件時的驗證功能及其驗證表達式介紹如下:

</tbody>
介紹
只能輸入數字:“^[0-9]*$”
只能輸入n位的數字:“^d{n}$”
只能輸入至少n位數字:“^d{n,}$”
只能輸入m-n位的數字:“^d{m,n}$”
只能輸入零和非零開頭的數字:“^(0|[1-9][0-9]*)$”
只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2})?$”
只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3})?$”
只能輸入非零的正整數:“^+?[1-9][0-9]*$”
只能輸入非零的負整數:“^-[1-9][0-9]*$”
只能輸入長度爲3的字符:“^.{3}$”
只能輸入由26個英文字母組成的字符串:“^[A-Za-z]+$”
只能輸入由26個大寫英文字母組成的字符串:“^[A-Z]+$”
只能輸入由26個小寫英文字母組成的字符串:“^[a-z]+$”
只能輸入由數字和26個英文字母組成的字符串:“^[A-Za-z0-9]+$”
只能輸入由數字、26個英文字母或者下劃線組成的字符串:“^w+$”
驗證用戶密碼:“^[a-zA-Z]w{5,17}$”正確格式爲:以字母開頭,長度在6-18之間,   只能包含字符、數字和下劃線。
驗證是否含有^%&'',;=?$"等字符:“[^%&'',;=?$x22]+”
只能輸入漢字:“^[u4e00-u9fa5],{0,}$”
驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
驗證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
驗證電話號碼:“^((d{3,4})|d{3,4}-)?d{7,8}$”
  正確格式爲:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
驗證身份證號(15位或18位數字):“^d{15}|d{}18$”
驗證一年的12個月:“^(0?[1-9]|1[0-2])$”正確格式爲:“01”-“09”和“1”“12”
驗證一個月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$” 正確格式爲:“01”“09”和“1”“31”。
匹配中文字符的正則表達式: [u4e00-u9fa5]
匹配雙字節字符(包括漢字在內):[^x00-xff]
匹配空行的正則表達式:n[s| ]*r
匹配HTML標記的正則表達式:/<(.*)>.*|<(.*) />/
匹配首尾空格的正則表達式:(^s*)|(s*$)
匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

六、常見的應用

6.1應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 

6.2應用:JavaScript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現

String.prototype.trim = function()  { 
	return this.replace(/(^s*)|(s*$)/g, ""); 
} 

6.3應用:利用正則表達式分解和轉換IP地址

function IP2V(ip) //IP地址轉換成對應數值 { 
	re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達式 
 if(re.test(ip)) { 
		return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
	} else { 
	 throw new Error("Not a valid IP address!") 
 } 
} 

6.4應用:從URL地址中提取文件名的javascript程序

	s="http://www.9499.net/page1.htm"; 
	s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;//Page1.htm 

6.5應用:利用正則表達式限制網頁表單裏的文本框輸入內容

用正則表達式限制只能輸入中文:

onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') "
onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^u4E00-u9FA5]/g,''))" 

用正則表達式限制只能輸入全角字符:

onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') "
onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^uFF00-uFFFF]/g,''))" 

用正則表達式限制只能輸入數字:

onkeyup="value=value.replace(/[^d]/g,'')"
onbeforepaste= "clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''))" 

用正則表達式限制只能輸入數字和英文:

onkeyup="value=value.replace(/[W]/g,'')"
onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''

  1. a-zA-Z ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章