首頁  >  文章  >  web前端  >  js中的正規表示式(一)

js中的正規表示式(一)

伊谢尔伦
伊谢尔伦原創
2016-11-22 14:34:18937瀏覽

字符含意做為轉意,即通常在""後面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜桿後/b/,轉意為匹配一個單字的邊界。 -或-對正規表示式功能字元的還原,如"*"匹配它前面元字元0次或多次,/a*/將匹配a,aa,aaa,加了""後,/a*/將只匹配"a*"。 ^符合一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"$匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"*匹配前面元字符0次或多次,/ba*/將匹配b,ba,baa,baaa+匹配前面元字符1次或多次,/ba*/將匹配ba,baa,baaa?匹配前面元字元0次或1次,/ba*/將符合b,ba(x)匹配x保存x在名為$1...$9的變數中x|y匹配x或y{n}精確地匹配n次{ n,}匹配n次以上{n,m}匹配n-m次[xyz]字符集(character set),匹配這個集合中的任一一個字符(或元字符)[^xyz]不匹配這個集合中的任何一個字元[b]匹配一個退格符b匹配一個單字的邊界B匹配一個單字的非邊界cX這兒,X是一個控制符,/cM/匹配Ctrl-Md匹配一個字數字符,/d/ = / [0-9]/D匹配一個非字數字符,/D/ = /[^0-9]/n匹配一個換行符r匹配一個回車符s匹配一個空白字符,包括n,r,f,t ,v等S匹配一個非空白字符,等於/[^nfrtv]/t匹配一個製表符v匹配一個重直製表符w匹配一個可以組成單詞的字符(alphanumeric,這是我的意譯,含數字),包括底線,如[w]匹配"$5.98"中的5,等於[a-zA-Z0-9]W匹配一個不可以組成單字的字符,如[W]匹配"$5.98"中的$,等於[^a-zA-Z0-9]。

用re = new RegExp("pattern",["flags"]) 的方式比較好
pattern : 正規表達式
flags: g (全文查找出現的所有pattern)
i (忽略大小寫)
m (多行查找)    vaScript動態正規表示式問題請問正規表示式可以動態產生嗎?
例如JavaScript中:
var str = "strTemp";
要產生:
var re = /strTemp/;
如果是字元連接::
var re = "/" + str + "/"即可
但是要產生表達式,可以實現嗎?怎樣實現?    

正則表達式是一個描述字符模式的對象。
JavaScript的RegExp物件和String物件定義了使用正規表示式來執行強大的模式匹配和文字擷取與替換函數的方法.


在JavaScript中,正則表達式是由一個RegExp物件表示的.當然,可以使用一個RegExp()建構函數來建立RegExp物件,
也可以用JavaScript 1.2中的新加入的一個特殊語法來建立RegExp物件.就像字串直接量被定義為包含在引號內的字元一樣,
正規表示式直接量也被定義為包含在一對斜線(/)之間的字元.所以,JavaScript可能會包含如下的程式碼:

var pattern = /s$/;

這行程式碼建立一個新的RegExp物件,並將它賦給變數parttern.這個特殊的RegExp物件和所有以字母"s"結尾的字串都符合.用RegExp()也可以定義
一個等價的正規表示式,程式碼如下:

var pattern = new RegExp("s$");

無論是用正則表達式直接量還是用構造函數RegExp(),創建一個RegExp對像都是比較容易的.較為困難的任務是用正規表示式語法來描述字元的模式.
JavaScript採用的是Perl語言正則表達式語法的一個相當完整的子集.

正則表達式的模式規範是由一系列字符構成的.大多數字符(包括所有字母數字字元)描述的都是按照字面意思進行匹配的字符.這樣說來,正則表達式/java/就和
所有包含子串"java" 的字符串相匹配.雖然正則表達式中的其它字元不是按照字面意思進行匹配的,但它們都具有特殊的意義.正則表達式/s$/ 包含兩個字符.
第一個特殊字符"s" 是按照字面意思與自身相匹配.第二個字元"$" 是一個特殊字元,它所匹配的是字串的結尾.所以正規表示式/s$/ 匹配的就是以字母"s" 結尾
的字串.

1.直接量字元

我們已經發現了,在正則表達式中所有的字母字符和數字都是按照字面意思與自身相匹配的.JavaScript的正則表達式還通過以反斜杠()開頭的轉義序列支持某些非

字母字元.例如,序列"n" 在字串中匹配的是一個直接量換行符.在正則表達式中,許多標點符號都有特殊的含義.下面是這些字符和它們的含義:

正則表達式的直接量字元

字符匹配
________________________________
字母數字字符自身
f 換頁符
n 換行符
r 回車
t 製表符
v 垂直製表符
/ 一個/ 直接量
一個直接量
. 一個. 直接量
* 一個* 直接量
+ 一個+ 直接量
? 一個? 直接量
| 一個| 直接量
( 一個( 直接量
) 一) 直接量 { [ 一[ 直接量
] 一個] 直接量
[ 一個[ 直接量
] 一個] 直接量
] 一個] 直接量
] 一個] 直接量
] 一個] 直接量
] 一個] 直接量

] 一個] 直接量

] 一個] 直接量

] 一個] 直接量

] 一個] 直接量

] 一個] 直接量

] 一個。一個{ 直接量

} 一個} 直接量

XXX 由十進制數XXX 指定的ASCII碼字元
Xnn 由十六進位數nn 指定的ASCII碼字元
cX 控製字元^X. 例如, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI等價於t, cI。 cJ等價於n

___________________________________________________

如果想在正規表示式中使用特殊的標點符號,必須在它們之前加上一個"" .

2.字符類


將單獨的直接符放進中括號內就可以組合成字元類別.一個字元類別和它所包含的任何一個字元都匹配,所以正規表示式/ [abc] / 和字母"a" , "b" , "c" 中的任何一個
都匹配.另外還可以定義否定字符類,這些類匹配的是除那些包含在中括號之內的字符外的所有字符.定義否定字符尖時,要將一個^ 符號作為從左中括號算起的第
一個字元.正規表示式的集合是/ [a-zA-z0-9] / .

由於某些字元類別非常常用,所以JavaScript的正則表達式語法包含一些特殊字元和轉義序列來表示這些常用的類別.例如, s 匹配的是空格符,製表符和其它空白符, s
匹配的則是空格符之外的任何字符.

正則表灰式的字符類

字符匹配
____________________________________________________
[...] 位於括號之內的任意字符

[^...] 不在括號之中的任意字符

. 除了換行符之外的任意字符,等價於[^n]

w 任何單字字符, 等價於[a-zA-Z0-9]

W 任何非單字字符,等價於[^a-zA-Z0-9]

s 任何空白符,等價於[ t n r f v]

S 任何非空白符,等價於[^ t n r f v]

d 任何數字,等價於[0-9]

D 除了數字之外的任何字符,等價於[^0-9]

[b] 一個退格直接量(特例)

________________________________________________________________

3.複製

用以上的正規表式的語法,可以把兩位數描述成/ d d /,把四位數描述成/ d d d d /.但我們還沒有一種方法可以用來描述具有任意多數位的數字或是一個

字串.這個字串由三個字元以及跟隨在字母之後的一位數字構成.這些複雜的模式使用的正則表達式語法指定了該表達式中每個元素要重複出現的次數.

指定複製的字符總是出現在它們所作用的模式後面.由於某種複製類型相當常用.所以有一些特殊的字符專門用於表示它們.例如: +號配對的就是複製前一模式一次

或多次的模式.下面的表列出了複製語法.先看一個例子:

/d{2, 4}/ //匹配2到4間的數字.

/w{3} d?/ //匹配三個單字字元和一個任意的數字.

/s+javas+/ //匹配字串"java" ,並且該字串前後可以有一個或多個空格.

/[^"] * / //匹配零個或多個非引號字元.

正規表示式的複製字元

字元意義

__________________________________________________________________

{n, m} 符合前一項至少n次字元,但是不能超過m次

{n, } 匹配前一項n次,或者多次

{n} 匹配前一項恰好n次

? 匹配前一項0次或1次,也就是說前一項是可選的. 等價於{0, 1}

+ 匹配前一項1次或多次,等價於{1,}

* 匹配前一項0次或多次.等價於{0,}

___________________________________________________________________

4.選擇,分組和引用

🎜正則表達式的語法還包括指定選擇項,對子表達式分組和引用前一子表達式的特殊字符.字符| 用於分隔供選擇的字符.例如: /ab|cd|ef/ 符合的是字串"ab",或是🎜🎜字串"cd",又或"ef". /d{3}|[a-z]{4}/ 符合的是要嘛是一個三位數,要嘛是四個小寫字母.在正則表達式中括號具有幾種作用.它的主要作用是把單獨的項目分組🎜🎜成子表達式,以便可以像處理一個獨立的單元那種用*、+或? 來處理那些項目.例如: /java(script) ?/ 匹配的是字符串"java",其後既可以有"script",也可以沒有. /🎜🎜(ab|cd ) + |ef) / 符合的既可以是字串"ef",也可以是字串"ab" 或"cd" 的一次或多次重複.🎜🎜在正規表示式中,括號的第二個用途是在完整的模式中定義子模式。當一個正規表示式成功地和目標字串相符時,可以從目標字串中抽出和括號中的子模式相匹配🎜

的部分.例如,假定我們正在檢索的模式是一個或多個字母後面跟隨一位或多位數字,那麼我們可以使用模式/ [a-z] + d+/.但是由於假定我們真正關心的是每個匹配

尾部的數字,那麼如果我們將模式的數字部分放在括號中(/ [a-z] + (d+)/) ,我們就可以從所檢索到的任何匹配中抽取數字了,之後我們會對此進行解析的.

代括號的子表達式的另一個用途是,允許我們在同一正則表達式的後面引用前面的子表達式.這是通過在字符串後加一位或多位數字來實現的.數字指的是代括號的

子表達式在正規表示式中的位置.例如: 1 引用的是第一個代括號的子表達式. 3 引用的是第三個代括號的子表達式.注意,由於子表達式可以嵌套在其它子表達式中,

所以它的位置是被計數的左括號的位置.
例如:在下面的正則表達式被指定為2:
/ ([Jj]ava([Ss]cript)) sis s (funw*) /

對正規表示式中前一子表達式的引用所指定的並不是那個子表達式的模式,而是與那個模式相符的文字.這樣,引用就不只是幫助你輸入正則表達式的重複部分的快

捷方式了,它還實施了一條規約,那就是一個字符串各個分離的部分包含的是完全相同的字元.例如:下面的正規表示式匹配的就是位於單引號或雙引號之內的所有字

符.但是,它要求開始和結束的引號匹配(例如兩個都是雙引號或者都是單引號):
/[' "] [^ ' "]*[' "]/

如果要求開始和結束的引號匹配,我們可以使用如下的引用:
/( [' "] ) [^ ' "] * 1/

1匹配的是第一個代括號的子表達式所匹配的模式.在這個例子中,它實施了一種規約,那就是開始的引號必須和結束的引號相匹配.注意,如果反斜線後跟隨的數字比

代括號的子表達式數多,那麼它就會被解析為一個十進制的轉義序列,而不是一個引用.你可以堅持使用完整的三個字符來表示轉義序列,這們就可以避免混淆了.例如,

使用

有关正则表达式的语法还有最后一个元素,那就是正则表达式的属性,它说明的是高级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它

们不出现在两个斜杠之间,而是位于第二个斜杠之后.javascript 1.2支持两个属性.属性 i 说明模式匹配应该是大小写不敏感的.属性 g 说明模式匹配应该是全局的.也

就是说,应该找出被检索的字符串中所有的匹配.这两种属性联合起来就可以执行一个全局的,大小写不敏感的匹配.

例如: 要执行一个大小不敏感的检索以找到词语 "java" (或者是 "java" 、"JAVA"等) 的第一个具体值,我们可以使用大小不敏感的正则表达式 /\b java\b/i .如果要在

一个字符串中找到 "java" 所有的具体值,我们还可以添加属性 g, 即 /\b java \b/gi .

以下是正则表达式的属性:

字符 含义
_________________________________________
i 执行大小写不敏感的匹配
g 执行一个全局的匹配,简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止了
_________________________________________

除属性 g 和 i 之外,正则表达式就没有其它像属性一样的特性了.如果将构造函数 RegExp 的静态属性 multiline 设置为 true ,那么模式匹配将以多行的模式进行.在这

种模式下,锚字符 ^ 和 $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的一行的开头和结尾.例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配

"Java\nis fun" .如果我们设置了 multiline 属性,那么后者也将被匹配:

RegExp.multiline = true;在JAVASCRIPT里面判断一个字符串是否是电子邮件的格式:if(formname.email.value!=formname.email.value.match(/^\w +[@]\w +[.][\w.] +$/)){alert("您的电子邮件格式错误!");formname.email.focus();return false;}    

[RED]function dateVerify(date){
var reg = /^(\d{4})(-)(\d{2})\2(\d{2})$/;
var r = date.match(reg);
if(r==null) return false;
var d= new Date(r[1], r[3]-1,r[4]);
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate();
date=r[1]+r[2]+((r[3]-1)+1)+r[2]+((r[4]-1)+1);
return newStr==date;
}[/RED]

javascript的17种正则表达式

"^\\d+$"  //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$"  //正整数
"^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$"  //负整数
"^-?\\d+$"    //整数
"^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
"^(-?\\d+)(\\.\\d+)?$"  //浮点数
"^[A-Za-z]+$"  //由26个英文字母组成的字符串
"^[A-Z]+$"  //由26个英文字母的大写组成的字符串
"^[a-z]+$"  //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
"^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //ur

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn