js——正则整理
1、示例
匹配網址url
function IsURL(str_url){var strRegex = "^((https|http|ftp|rtsp|mms)?://)"+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 + "|" // 允許IP和DOMAIN(域名)+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www. + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二級域名 + "[a-z]{2,6})" // first level domain- .com or .museum + "(:[0-9]{1,4})?" // 端口- :80 + "((/?)|" // a slash isn't required if there is no file name + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; var re=new RegExp(strRegex); if (re.test(str_url)){return (true); }else{ return (false); } } var testUrl; testUrl="harveyzeng.iteye.com/blog/1776991"; alert(IsURL(testUrl)); View Code匹配手機號碼
var mobile = /^(13[0-9]{9})|(18[0-9]{9})|(14[0-9]{9})|(17[0-9]{9})|(15[0-9]{9})$/; // 或 var mobile = /^1[34578]\d{9}$/; View Code匹配固話
var tel = /^([0-9]{3,4}-)?[0-9]{7,8}$/; View Code匹配身份證號碼
var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; View Code匹配密碼
// 以字母開頭,長度在6-18之間,只能包含字符、數字和下劃線 var password = /^[a-zA-Z]\w{5,17}$/; View Code匹配一年的12個月
var month = /^(0?[1-9]|1[0-2])$/; View Code匹配一個月的31天
var day = /^((0?[1-9])|((1|2)[0-9])|30|31)$/; View Code匹配Email地址
var email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; View Code匹配漢字
var n = /^[\u4e00-\u9fa5],{0,}$/; View Code匹配html標簽
var html = /<(.*)>(.*)<\/(.*)>|<(.*)\/>/; View Code用正則表達式限制只能輸入中文
οnkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" View Code用正則表達式限制只能輸入數字和英文
οnkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" View Code2、 可選項修飾符,可以組合使用
- g : 全文查找
- i :忽略大小寫
- m : 多行查找
3、正則表達式模式
| [abc] | 匹配 abc 其中的一個 |
| [^abc] | 匹配 除abc 之外的字符 |
| (x|y) | 匹配 x 或者 y |
?
4、正則表達式中的預定義類
| . | IE下[^\n],其他[^\n\r] | 匹配除了換行和行結束符之外的單個字符 |
| \d | [0-9] | 匹配數字 |
| \D | [^0-9] | 匹配非數字字符 |
| \b | /\bc/.exec('acbc');匹配右側邊界的c | 匹配單詞邊界 |
| \B | /\Bc/.exec('bcbc') ;成功地匹配到bcbc中的c | 匹配非單詞邊界 |
| \s | [\n\r\t\f\x0B] | 匹配一個空白字符 |
| \S | [^\n\r\t\f\x0B] | 匹配一個非空白字符 |
| \w | [a-zA-Z0-9_] | 匹配字母數字和下劃線 |
| \W | [^a-zA-Z0-9_] | 匹配除字母數字下劃線之外的字符 |
| \0 | ? | 查找NULL字符 |
| \n | ? | 查找換行符 |
| \xxx | ? | 查找以八進制數 xxx 規定的字符 |
| \xdd | ? | 查找以十六進制數 dd 規定的字符 |
| \uxxxx | ? | 查找以十六進制數 xxxx 規定的 Unicode 字符 |
5、量詞(下表量詞到{n,m}之前,單個出現時皆是貪婪量詞)
| * | 匹配零次或多次 | zo* 能匹配 “z” 以及 “zoo” 。等價于 {0,} |
| + | 匹配一次或多次 | '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 | 匹配以n開頭的字符串 | ? |
| ?=n | 匹配任何其后緊接指定字符串n的字符串 | (?=pattern)所謂正向預查,意思就是:要匹配的字符串,后面必須緊跟著pattern。我們知道正則表達式/cainiao/會匹配cainiao。同樣,也會匹配cainiao9中的cainiao。但是我們可能希望,cainiao只能匹配cainiao8中的cainiao。這時候就可以像下面這樣寫:/cainiao(?=8)/ |
| ?!n | 匹配任何其后沒有緊接指定字符串n的字符串 | ? |
6、 貪婪量詞與惰性量詞
- 用貪婪量詞進行匹配時,它首先會將整個字符串當成一個匹配,如果匹配的話就退出。如果不匹配,就把最后一個字符去掉再進行匹配,不匹配繼續去掉最后一個字符,直到找到一個匹配或者不剩任何字符為止
- 用惰性量詞進行匹配時,先看第一個字符串是否匹配,如果不匹配就加入第二個字符串以此類推,直到找到一個匹配或者不剩任何字符為止
7、分組與非捕獲性分組
re = /abc{2}/;//將匹配abcc re = /(abc){2}/;//將匹配abcabc //上面的分組都是捕獲性分組 str = "abcabc ###"; arr = re.exec(str); alert(arr[1]);//abc //非捕獲性分組 (?:) re = /(?:abc){2}/; arr = re.exec(str); alert(arr[1]);//undefined View Code8、反向引用
當包含分組的正則表達式進行過test,match,search這些方法之后,每個分組都被放在一個特殊的地方以備將來使用,這些存儲是分組中的特殊值,我們稱之為反向引用
var re = /(A?(B?(C?)))/; /*上面的正則表達式將依次產生三個分組 (A?(B?(C?))) 最外面的 (B?(C?)) (C?)*/ str = "ABC"; re.test(str);//反向引用被存儲在RegExp對象的靜態屬性1-9中 alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3); //反向引用也可以在正則表達式中使用\1 ,\2...這類的形式使用 re = /\d+(\D)\d+\1\d+/; str = "2008-1-1"; alert(re.test(str));//true str = "2008-4_3"; alert(re.test(str));//false // 使用反向引用可以要求字符串中某幾個位置上的字符必須相同.另外,在replace這類方法中可用特殊字符序列來表示反向引用 re = /(\d)\s(\d)/; str = "1234 5678"; alert(str.replace(re,"21"));//在這個里面1表示第一個分組1234,2則表示5678 View Code9、正向前瞻
正向前瞻,用來捕獲出現在特定字符之前的字符,只有當字符后面跟著某個特定字符才去捕獲它。與正向前瞻對應的有負向前瞻,它用匹配只有當字符后面不跟著某個特定字符時才去匹配它。在執行前瞻和負向前瞻之類的運算時,正則表達式引擎會留意字符串后面的部分,然而卻不移動index
//正向前瞻 re = /([a-z]+(?=\d))/i; //我們要匹配后面跟一個數字的單詞,然后將單詞返回,而不要返回數字 str = "abc every1 abc"; alert(re.test(str));//true alert(RegExp.$1);//every alert(re.lastIndex);//使用前瞻的好處是,前瞻的內容(?=\d)并不會當成一次匹配,下次匹配仍從它開始 //負向前瞻(?!) re = /([a-z](?!\d))/;i //將匹配后面不包含數字的字母,并且不會返回(?!\d)中的內容 str = "abc1 one"; alert(re.test(str)); alert(RegExp.$1);//one View Code10、正則表達式對象的方法
match: 使用正則表達式模式對字符串執行查找,并將包含查找的結果作為數組返回
stringObj.match(rgExp) // 如果match的表達式匹配了全局標記g將出現所有匹配項,而不用循環,但所有匹配中不會包含子匹配項 View Codeexec: 用正則表達式模式在字符串中運行查找,并返回包含該查找結果的第一個值(數組),如果匹配失敗,返回null
test: 返回一個Boolean值,它指出在被查找的字符串中是否匹配給出的正則表達式。
search: 返回與正則表達式查找內容匹配的第一個子字符串的位置(偏移位),如果沒有返回-1
replace: 返回根據正則表達式進行文字替換后的字符串的復制
split: 將一個字符串分割為子字符串,然后將結果作為字符串數組返回
compile: 用于在腳本執行過程中編譯正則表達式;也可用于改變和重新編譯正則表達式
11、 正則表達式對象的屬性
source: 返回正則表達式模式的文本的復本,只讀
var re = /[a-z]/i; alert(re.source);//將[a-z]字符串輸出 //請注意,直接alert(re)會將正則表達式連同前向斜線與標志輸出,這是re.toString方法定義的 View Codelastindex: 返回字符位置,它是被查找字符串中下一次成功匹配的開始位置,默認值是-1
var re = /[A-Z]/; //exec方法執行后,修改了re的lastIndex屬性, var str = "Hello,World!!!"; var arr = re.exec(str); alert(re.lastIndex);//0,因為沒有設置全局標志 re = /[A-Z]/g; arr = re.exec(str); alert(re.lastIndex);//1 arr = re.exec(str); alert(re.lastIndex);//7 View Code1-9: 返回九個在模式匹配期間找到的、最近保存的部分。只讀。
input($_):返回執行規范表述查找的字符串。只讀
lastMatch($&): 返回任何正則表達式搜索過程的最后匹配的字符。只讀
//lastMatch 最后匹配的字符 re = /[a-z]/g; str = "hi"; re.test(str); alert(RegExp.lastMatch);//h re.test(str); alert(RegExp["$&"]);//i ,$&是lastMatch的短名字,但它不是合法變量名 View CodelastParen($+): 如果有的話,返回任何正則表達式查找過程中最后包括的子匹配。只讀
//lastParen 最后匹配的分組 re = /[a-z](\d+)/gi; str = "Class1 Class2 Class3"; re.test(str); alert(RegExp.lastParen);//1 re.test(str); alert(RegExp["$+"]);//2 View CodeleftContext($`): 返回被查找的字符串中從字符串開始位置到最后匹配之前的位置之間的字符。只讀
rightContext($''): 返回被搜索的字符串中從最后一個匹配位置開始到字符串結尾之間的字符。只讀
multiline($*): 屬性返回正則表達式是否使用多行模式。這個屬性不針對某個正則表達式實例,而是針對所有正則表達式
//因為IE,Opera不支持這個屬性,所以最好還是單獨指定 var re = /\w+/m; alert(re.multiline); alert(RegExp["$*"]);//RegExp對象的靜態屬性不會因為給RegExp某個對象實例指定了m標志而改變 RegExp.multiline = true;//這將打開所有正則表達式實例的多行匹配模式 alert(RegExp.multiline); View Code使用元字符注意事項: 元字符是正則表達式的一部分,當要匹配正則表達式本身時,必須對這些元字符轉義
所有元字符: () [] {} \ ^ $ | ? * + .
參考:
http://www.cnblogs.com/zfc2201/archive/2012/12/18/2824107.html
http://www.jb51.net/article/28007.htm
http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html
?
轉載于:https://www.cnblogs.com/ywang/p/7815681.html
總結
- 上一篇: git编译安装与常见问题解决
- 下一篇: Oracle 常用命令举例