用以記錄工作中遇到的離散知識。(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,''
a-zA-Z ↩︎