正則表達式
正則表達式是一個考驗每個程序員記憶力的功能,大家都經歷過忘了再記,記了再忘的痛苦,在這里試圖先通過一個簡單的表格方式來呈現它,然后再慢慢品味,消化它。
1.符號表
| 名稱 | 符號 | 讀音 | 功能 |
| 定界符 | /love/ | 右斜杠 | 位于“/”定界符之間的部分就是將要在目標對象中進行匹配的模式 |
| 普通字符 | [abc] | 匹配中括號中的所有字符 | |
| 元字符 | 所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式 | ||
| + | 加號 | “+”元字符規定其前導字符必須在目標對象中連續出現一次或多次, | |
| * | 星花 | “*”元字符規定其前導字符必須在目標對象中出現零次或連續多次 | |
| ? | 問號 | “?”元字符規定其前導對象必須在目標對象中連續出現零次或一次,或指明一個非貪婪限定符。通過在 *、+ 或?限定符之后放置?,該表達式從"貪婪"表達式轉換為"非貪婪"表達式或者最小匹配 | |
| \s | 左斜杠小s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符 | |
| \S | 左斜杠大s | 匹配任何非空白字符,等價于 [^ \f\n\r\t\v] | |
| \d | 左斜杠小d | “\d”用于匹配從0到9的數字 | |
| \w | 左斜杠小w | “\w”用于匹配字母,數字或下劃線字符 | |
| \W | 左斜杠大w | “\W”用于匹配所有與\w不匹配的字符 | |
| . | 點 | “.”用于匹配除換行符之外的所有字符 | |
| 定位符 | 定位符用于規定匹配模式在目標對象中的出現位置 | ||
| ^ | 尖帽 | “^”定位符規定匹配模式必須出現在目標字符串的開頭 | |
| $ | 美元符 | 匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multiline屬性,則$也匹配 '\n' 或 '\r'。要匹配$字符本身,請使用\$ | |
| \b | 左斜杠小b | “\b”定位符規定匹配模式必須出現在目標字符串的開頭或結尾的兩個邊界之一 | |
| \B | 左斜杠大B | “\B”定位符則規定匹配對象必須位于目標字符串的開頭和結尾兩個邊界之內,即匹配對象既不能作為目標字符串的開頭,也不能作為目標字符串的結尾 | |
| 頻率符 | {} | 左花括號右花括號 | “{}”可以精確指定模式在匹配對象中出現的頻率 |
| {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?'。請注意在逗號和兩個數之間不能有空格。 | |
| 范圍符 | [A-Z] | 左中括號右中括號 | “[]”允許使用者在匹配模式中指定某一個范圍而不局限于具體的字符 |
| 同時出現符 | () | 左圓括號右圓括號 | “()”符號包含的內容必須同時出現在目標對象中 |
| 運算符 | | | 豎杠 | 可以使用管道符 “|”實現類似編程邏輯中的“或”運算 |
| [^] | 左中括號尖帽右中括號 | 否定符 “[^]”規定目標對象中不能存在模式中所規定的字符串 | |
| 轉義符 | \ | 左斜杠 | 當需要在正則表達式的模式中加入元字符,并查找其匹配對象時,可以使用轉義符“\” |
| 非打印字符 | \cx | 控制符 | 匹配由x指定的控制字符。例如\cM匹配一個Control-M或回車字符。x的值必須為A-Z或a-z |
| \f | 換頁符 | 匹配一個換頁符,等價于 \x0c 和 \cL | |
| \n | 換行符 | 匹配一個換行符,等價于\x0a和\cJ | |
| \r | 回車符 | 匹配一個回車符,等價于\x0d和\cM | |
| \t | 制表符 | 匹配一個制表符,等價于\x09和\cl | |
| \v | 垂直制表符 | 匹配一個垂直制表符,等價于\x0b和\ck | |
1.1普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。包含所有大寫和小寫字母,所有數字,所有標點符號和一些其他字符。
[ABC]:匹配[...]中所有的字符,例如[aeiou]匹配字符串“google runoob taobao”中所有的aeiou字符,如下:

[^ABC]:匹配除了[...]中字符以外的所有字符,例如[^aeiou]匹配字符串“google runoob taobao”中除了aeiou之外的所有字母,如下:

[A-Z]:[A-Z]表示一個區間,匹配所有大寫字母,[a-z]表示所有小寫字母,如下:

.:匹配除換行符(\r, \n)之外的任何單個字符,等于[^\n\r],如下:

[\s\S]:匹配所有。\s是匹配所有空白字符,包含換行,\S非空白符,不包含換行,如下:

\w:匹配字母,數字,下劃線。等價于[A-Za-z0-9_],如下:

1.2非打印字符
非打印字符也可以是正則表達式的一部分,下表列舉了非打印字符的轉義序列。
| 字符 | 描述 |
| \cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的 'c' 字符。 |
| \f | 匹配一個換頁符。等價于 \x0c 和 \cL |
| \n | 匹配一個換行符。等價于 \x0a 和 \cJ |
| \r | 匹配一個回車符。等價于 \x0d 和 \cM |
| \s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符 |
| \S | 匹配任何非空白字符。等價于 [^ \f\n\r\t\v] |
| \t | 匹配一個制表符。等價于 \x09 和 \cI |
| \v | 匹配一個垂直制表符。等價于 \x0b 和 \cK |
1.3特殊字符
所謂特殊字符,就是一些有特殊含義的字符,如runoo*b中的*,簡單的說就是表示任何字符串的意思。如果要查找字符串中的*符號,則需要對*進行轉義,即在起前面加一個\,例如runo\*ob匹配字符串runo*ob。
許多元字符要求在試圖匹配他們的時候對他們特別對待,若要匹配這些特殊字符,必須首先使字符轉義,即,使用反斜杠\放在他們前面。
| $ | 匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$ |
| ^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符本身,請使用 \^ |
| () | 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \) |
| * | 匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \* |
| + | 匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+ |
| ? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \? |
| . | 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. |
| [ | 標記一個中括號表達式的開始。要匹配 [,請使用 \[ |
| ] | 標記一個中括號表達式的結束。要匹配 ],請使用 \] |
| { | 標記限定符表達式的開始。要匹配 {,請使用 \{ |
| } | 標記限定符表達式的結束。要匹配 },請使用 \} |
| \ | 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "(" |
| | | 指明兩項之間的一個選擇。要匹配 |,請使用 \| |
1.4限定符
限定符用來指定正則表達式的一個給定的組件必須出現多少次才能滿足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m}共6種。
| * | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,} |
| + | 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,} |
| ? | 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "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?'。請注意在逗號和兩個數之間不能有空格 |
正則表達式/[1-9][0-9]*/g匹配一個正整數,[1-9]是指第一位數字不能是0,[0-9]*匹配任意多個數字。
注意限定符出現在范圍表達式之后。因此,它應用于整個范圍表達式,在本例中,只指定從0到9的數字(包括0和9)。這里不適用+限定符,因為在第二個位置或后面不一定需要有一個數字。也不適用?字符,因為使用?會將整數限制到只有兩位數。
如果想想設置0~99的兩位數,可以使用
/[0-9]{1,2}/
這個表達式的缺點是,只能匹配兩位數字,而且可以匹配0,00,01,10,99的章節編號仍只匹配開頭兩位數字,改進一下,匹配1~99的正則表達式如下:
/[1-9][0-9]?/ 或 /[1-9][0-9]{0,1}/
*和+限定符都是貪婪的,因為他們會盡可能多的匹配文字,只有在他們的后面加上一個?就可以實現非貪婪或最小匹配。
例如:要搜索html文檔,以查找在h1標簽內容。HTML代碼如下:
<h1>標題1</h1>
貪婪:下面的表達式匹配從開始小括號(<)到關閉h1標記的大括號(>)之間所有的內容,得到的結果是<h1>標題1</h1>
/<.*>/
非貪婪:如果只需要匹配開始和結束h1標簽,下面的非貪婪表達式只匹配<h1>
/<.*?>/
也可以使用下面的表達式來匹配h1標簽:
/<\w+?>/
通過在 *,+ 或 ? 限定符知否放置 ? ,表達式從“貪婪”表達式轉換為“非貪婪”表達式或者最小匹配。
1.4定位符
定位符能將正則表達式固定到行首或行尾,還可以使用定位符匹配一個單詞內部,一個單詞的開頭或者一個單詞的結尾。
定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指定字符串的開始與結束,\b描述單詞的前后邊界,\B表示費單詞邊界。正則表達式定位符有:
| ^ | 匹配輸入字符串開始的位置。如果設置了RegExp對象的Muliline屬性,^還會與\n,\r之后的位置匹配。 |
| $ | 匹配輸入字符串結尾的位置。如果設置了RegExp對象的Multiline屬性,$還會與\n,\r之前的位置匹配。 |
| \b | 匹配一個單詞邊界,即與空格鍵的位置。 |
| \B | 匹配非單詞邊界。 |
注意:不能將限定符與定位符一起使用。由于在緊靠換行或者單詞邊界的前面或者后面不能有一個以上的位置,因此不允許有^*這樣的表達式。
若要匹配一行文本開始出的文本,需要在正則表達式的開始使用^字符。不要將^這種寫法與中括號表達式內的用法混淆。
若要匹配一行文本結束出的文本,需要在正則表達式的結束處使用$字符。
若要在搜索章節標題時使用定位點,下面的正則表達式匹配一個章節標題,該標題只包含兩個尾隨數字,并且出現在行首:
/^Chapter [1-9][0-9]{0,1}/

真正的章節標題不僅出現在行的開始處,而且它還是該行中僅有的文本。它既出現在行首又出現在同一行的結尾。下面的表達式能確保指定的匹配只匹配章節而不匹配交叉引用。通過創建只匹配一行文本的開始和結尾的正則表達式就可以做到這一點。
/^Chapter [1-9][0-9]{0,1}$/
匹配單詞邊界稍有不同,但向正則表達式添加了很重要的功能。單詞邊界是單詞和空格之間的位置,非單詞邊界是任何其他位置。下面的表達式匹配單詞Chapter的開頭三個字符,因為這三個字符出現在單詞邊界后面:
/\bCha/

\b字符的位置非常重要。如果它位于要匹配的字符串的開始,它在單詞的開始處查找匹配項。如果它位于字符串的結尾,它在單詞的結尾處查找匹配。例如下面的表達式匹單詞Chapter中的字符串ter,因為它出現在單詞邊界的前面:
/ter\b/
下面的表達式匹配Chapter中的字符串apt,但是不匹配aptitude中的字符串apt:
/\Bapt/
字符串apt出現在單詞Chapter中的非單詞邊界處,但是出現在單詞aptitude中的單詞邊界處。對于\B非單詞邊界運算符,位置并不重要,因為匹配不關心究竟是單詞開頭還是單詞結尾。

1.5選擇
用圓括號()將所有選擇項括起來,相鄰的選擇項質檢用 | 分割。
() 表示捕獲分組,()會把每個分組里的匹配的值保存起來,多個匹配值可以通過數字 n 來看(n是一個數字,表示第n個捕獲組的內容)
但使用園括號會有一個副作用,使相關的匹配被緩存,此時可用 ?: 放在第一個選項前來消除這種副作用。
其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?! ,這兩個還有更多的含義,前者為正向魚叉,在任何開始匹配圓括號內的正則表達式模式的位置來搜索字符串,后者為負向檢查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。
2.基本語法
正則表達式(regulare expression)描述了一種字符串匹配的模式(pattern),可以用來監測一個字符串是否包含某個子字符串,將匹配的子字符串替換,或者從某個字符串中提取出符合條件的子字符串。
例如:
- runoo+b,可以匹配出runoob,runooob,runooooooob等,runo必須出現,o+代表字符o必須至少出現1次(1次或多次)。
- runoo*b,可以匹配出runob,runoob,runooooob等,runo必須出現,o*代表字符o可以不出現,也可以出現1次或者多次(0次或1次或多次)。
- colou?r,可以匹配color或者colour,colo必須出現,u?代表字符u最多只可以出現1次(0次或1次)
2.1構造正則表達式
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多元字符串與運算符將小的表達式結合在一起來創建更大的表達式。正則表達式的組合可以是單個字符,字符集合,字符范圍,字符間的選擇或者這些任意組合起來。
正則表達式是由普通字符(例如字符a到z)以及特殊字符(稱為“元字符”)組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與搜索的字符串進行匹配。
在JavaScript中有兩種方式構造正則表達式。
使用正則表達式字面量
正則表達式的形式一般如:/love/,這種叫“直接量語法”,還有一種叫RegExp構造函數,貌似這兩種是差不多的?!爸苯恿空Z法”的格式形如/pattern/attributes。腳本加載后,正則表達式字面量就會被編譯。當正則表達式保持不變時,使用這種方式可以獲得更好的性能。
使用RegExp構造函數
RegExp構造函數的個數形如new RegExp(pattern,attributes)。腳本運行過程中,使用構造函數創建的正則表達式會被編譯。如果正則表達式將會改變,或者它將會從用戶輸入等來運中動態地生成,就需要使用構造函數來創建正則表達式。
其中位于“/”定界符之間的部分就是將要在目標對象中進行匹配的模式。用戶只要把希望查找匹配對象的模式內容放入“/”定界符之間即可。為了能夠使用戶更加靈活的定制模式內容,正則表達式提供了專門的“元字符”。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式。
較為常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符規定其前導字符必須在目標對象中連續出現一次或多次,“*”元字符規定其前導字符必須在目標對象中出現零次或連續多次,而“?”元字符規定其前導對象必須在目標對象中連續出現零次或一次。
下面,就讓我們來看一下正則表達式元字符的具體應用。
/fo+/因為上述正則表達式中包含“+”元字符,表示可以與目標對象中的 “fool”, “fo”, 或者 “football”等在字母f后面連續出現一個或多個字母o的字符串相匹配。
/eg*/因為上述正則表達式中包含“*”元字符,表示可以與目標對象中的 “easy”, “ego”, 或者 “egg”等在字母e后面連續出現零個或多個字母g的字符串相匹配。
/Wil?/因為上述正則表達式中包含“?”元字符,表示可以與目標對象中的 “Win”, 或者 “Wilson”,等在字母i后面連續出現零個或一個字母l的字符串相匹配。
除了元字符之外,用戶還可以精確指定模式在匹配對象中出現的頻率。例如,/jim{2,6}/上述正則表達式規定字符m可以在匹配對象中連續出現2-6次,因此,上述正則表達式可以同jimmy或jimmmmmy等字符串相匹配。
在對如何使用正則表達式有了初步了解之后,我們來看一下其它幾個重要的元字符的使用方式。
\s:用于匹配單個空格符,包括tab鍵和換行符;
\S:用于匹配除單個空格符之外的所有字符;
\d:用于匹配從0到9的數字;
\w:用于匹配字母,數字或下劃線字符;
\W:用于匹配所有與\w不匹配的字符;
. :用于匹配除換行符之外的所有字符。
(說明:我們可以把\s和\S以及\w和\W看作互為逆運算)
下面,我們就通過實例看一下如何在正則表達式中使用上述元字符。
/\s+/上述正則表達式可以用于匹配目標對象中的一個或多個空格字符。
/\d000/如果我們手中有一份復雜的財務報表,那么我們可以通過上述正則表達式輕而易舉的查找到所有總額達千元的款項。
除了我們以上所介紹的元字符之外,正則表達式中還具有另外一種較為獨特的專用字符,即定位符。定位符用于規定匹配模式在目標對象中的出現位置。較為常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符規定匹配模式必須出現在目標字符串的開頭,“$”定位符規定匹配模式必須出現在目標對象的結尾,\b定位符規定匹配模式必須出現在目標字符串的開頭或結尾的兩個邊界之一,而“\B”定位符則規定匹配對象必須位于目標字符串的開頭和結尾兩個邊界之內,即匹配對象既不能作為目標字符串的開頭,也不能作為目標字符串的結尾。同樣,我們也可以把“^”和“$”以及“\b”和“\B”看作是互為逆運算的兩組定位符。舉例來說:
/^hell/因為上述正則表達式中包含“^”定位符,所以可以與目標對象中以 “hell”, “hello”或 “hellhound”開頭的字符串相匹配。
/ar$/因為上述正則表達式中包含“$”定位符,所以可以與目標對象中以 “car”, “bar”或 “ar” 結尾的字符串相匹配。
/\bbom/因為上述正則表達式模式以“\b”定位符開頭,所以可以與目標對象中以 “bomb”, 或 “bom”開頭的字符串相匹配。
/man\b/因為上述正則表達式模式以“\b”定位符結尾,所以可以與目標對象中以 “human”, “woman”或 “man”結尾的字符串相匹配。
為了能夠方便用戶更加靈活的設定匹配模式,正則表達式允許使用者在匹配模式中指定某一個范圍而不局限于具體的字符。例如:
/[A-Z]/上述正則表達式將會與從A到Z范圍內任何一個大寫字母相匹配。
/[a-z]/上述正則表達式將會與從a到z范圍內任何一個小寫字母相匹配。
/[0-9]/上述正則表達式將會與從0到9范圍內任何一個數字相匹配。
/([a-z][A-Z][0-9])+/上述正則表達式將會與任何由字母和數字組成的字符串,如 “aB0” 等相匹配。這里需要提醒用戶注意的一點就是可以在正則表達式中使用 “()” 把字符串組合在一起?!?)”符號包含的內容必須同時出現在目標對象中。因此,上述正則表達式將無法與諸如 “abc”等的字符串匹配,因為“abc”中的最后一個字符為字母而非數字。
如果我們希望在正則表達式中實現類似編程邏輯中的“或”運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 “|”。例如:/to|too|2/,上述正則表達式將會與目標對象中的 “to”, “too”, 或 “2” 相匹配。正則表達式中還有一個較為常用的運算符,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規定目標對象中不能存在模式中所規定的字符串。例如:/[^A-C]/,上述字符串將會與目標對象中除A,B,和C之外的任何字符相匹配。一般來說,當“^”出現在 “[]”內時就被視做否定運算符;而當“^”位于“[]”之外,或沒有“[]”時,則應當被視做定位符。最后,當用戶需要在正則表達式的模式中加入元字符,并查找其匹配對象時,可以使用轉義符“\”。例如:/Th\*/上述正則表達式將會與目標對象中的“Th*”而非“The”等相匹配。
3.舉例說明
再者只能多看寫例子,消化消化了。
“^The”:開頭一定要有”The”字符串;“of despair$”:結尾一定要有”of despair” 的字符串;那么,“^abc$”:就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配;“notice”:匹配包含notice的字符串;接著,說說 ‘*’ ‘+’ 和 ‘?’,他們用來表示一個字符可以出現的次數或者順序,他們分別表示:
“zero or more”相當于{0,}
“one or more”相當于{1,}
“zero or one.”相當于{0,1}
這里是一些例子:
“ab*”:和ab{0,}同義,匹配以a開頭,后面可以接0個或者N個b組成的字符串(”a”, “ab”, “abbb”, 等);
“ab+”:和ab{1,}同義,同上條一樣,但最少要有一個b存在 (”ab” “abbb”等);
“ab?”:和ab{0,1}同義,可以沒有或者只有一個b;
“a?b+$”:匹配以一個或者0個a再加上一個以上的b結尾的字符串。
要點:’*’ ‘+’ 和 ‘?’ 只管它前面那個字符。你也可以在大括號里面限制字符出現的個數,比如:
“ab{2}”: 要求a后面一定要跟兩個b(一個也不能少)(”abb”);
“ab{2,}”: 要求a后面一定要有兩個或者兩個以上b(如”abb” “abbbb” 等);
“ab{3,5}”: 要求a后面可以有2-5個b(”abbb”, “abbbb”, or “abbbbb”)。
現在我們把一定幾個字符放到小括號里,比如:
“a(bc)*”: 匹配 a 后面跟0個或者一個”bc”;
“a(bc){1,5}”: 一個到5個 “bc”;
還有一個字符 ‘|’,相當于OR操作:
“hi|hello”: 匹配含有”hi” 或者 “hello” 的 字符串;
“(b|cd)ef”: 匹配含有 “bef” 或者 “cdef”的字符串;
“(a|b)*c”: 匹配含有這樣多個(包括0個)a或b,后面跟一個c的字符串;
一個點(’.’)可以代表所有的單一字符,不包括”\n”如果,要匹配包括”\n”在內的所有單個字符,怎么辦?用’[\n.]’這種模式。
“a.[0-9]”: 一個a加一個字符再加一個0到9的數字;
“^.{3}$”: 三個任意字符結尾。
中括號括住的內容只匹配一個單一的字符
“[ab]”: 匹配單個的 a 或者 b ( 和 “a│b” 一樣);
“[a-d]”: 匹配’a’ 到’d’的單個字符 (和”a│b│c│d” 還有 “[abcd]”效果一樣);
一般我們都用[a-zA-Z]來指定字符為一個大小寫英文:
“^[a-zA-Z]”: 匹配以大小寫字母開頭的字符串;
“[0-9]%”: 匹配含有 形如 x% 的字符串;
“,[a-zA-Z0-9]$”: 匹配以逗號再加一個數字或字母結尾的字符串;
也可以把你不想要得字符列在中括號里,你只需要在總括號里面使用’^’ 作為開頭 “%[^a-zA-Z]%” 匹配含有兩個百分號里面有一個非字母的字符串。要點:^用在中括號開頭的時候,就表示排除括號里的字符。不要忘記在中括號里面的字符是這條規路的例外—在中括號里面,所有的特殊字符,包括(”),都將失去他們的特殊性質 “[*\+?{}.]”匹配含有這些字符的字符串:正如regx的手冊告訴我們:”如果列表里含有’]’,最好把它作為列表里的第一個字符(可能跟在’^’后面)。如果含有’-’,最好把它放在最前面或者最后面, or 或者一個范圍的第二個結束點[a-d-0-9]中間的‘-’將有效?;ɡㄌ栔械囊⒁獾氖?,n和m都不能為負整數,而且n總是小于m。這樣,才能 最少匹配n次且最多匹配m次。如”p{1,5}”將匹配 “pvpppppp”中的前五個p。
構建一個匹配模式去檢查輸入的信息是否為一個表示money的數字。我們認為一個表示money的數量有四種方式:”10000.00″ 和 “10,000.00″,或者沒有小數部分,”10000″ and “10,000″。現在讓我們開始構建這個匹配模式:
^[1-9][0-9]*$
這是所變量必須以非0的數字開頭。但這也意味著單一的”0″也不能通過測試。以下是解決的方法:
^(0|[1-9][0-9]*)$
“只有0和不以0開頭的數字與之匹配”,我們也可以允許一個負號在數字之前:
^(0|-?[1-9][0-9]*)$
這就是:0或者一個以0開頭且可能有一個負號在前面的數字。好了,現在讓我們別那么嚴謹,允許以0開頭?,F在讓我們放棄負號,因為我們在表示錢幣的時候并不需要用到。我們現在指定模式用來匹配小數部分:
^[0-9]+(\.[0-9]+)?$
這暗示匹配的字符串必須最少以一個阿拉伯數字開頭。但是注意,在上面模式中 “10.” 是不匹配的, 只有 “10″ 和 “10.2″ 才可以,為什么?
^[0-9]+(\.[0-9]{2})?$
我們上面指定小數點后面必須有兩位小數。如果你認為這樣太苛刻,你可以改成:^[0-9]+(\.[0-9]{1,2})?$。這將允許小數點后面有一到兩個字符?,F在我們加上用來增加可讀性的逗號(每隔三位),我們可以這樣表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ 不要忘記’+’可以被’*’替代如果你想允許空白字符串被輸入話,也不要忘記反斜桿’\’在php字符串中可能會出現錯誤 (很普遍的錯誤):現在,我們已經可以確認字符串了,我們現在把所有逗號都去掉str_replace(”,”, “”, $money)然后在把類型看成double然后我們就可以通過他做數學計算了。
再來構建一個完整的email,在一個完整的email地址中有三個部分:
1. 用戶名 (在 ‘@’ 左邊的一切)
2.’@’
3. 服務器名(就是剩下那部分)
用戶名可以含有大小寫字母阿拉伯數字,句號(’.’)減號(’-’)and下劃線’_’)。服務器名字也是符合這個規則,當然下劃線除外。現在,用戶名的開始和結束都不能是句點,服務器也是這樣。還有你不能有兩個連續的句點他們之間至少存在一個字符,好現在我們來看一下怎么為用戶名寫一個匹配模式:
^[_a-zA-Z0-9-]+$
現在還不能允許句號的存在。我們把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是說:以至少一個規范字符(除了.)開頭,后面跟著0個或者多個以點開始的字符串。
簡單化一點, 我們可以用eregi()取代ereg()、eregi()對大小寫不敏感, 我們就不需要指定兩個范圍 “a-z” 和 “A-Z”只需要指定一個就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服務器名字也是一樣,但要去掉下劃線:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
現在只需要用”@”把兩部分連接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
這就是完整的email認證匹配模式了,只需要調用:
eregi(”^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$”,$eamil)
就可以得到是否為email了
電話號碼正則表達式(支持手機號碼,3-4位區號,7-8位直播號碼,1-4位分機號) ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
匹配格式:
11位手機號碼
3-4位區號,7-8位直播號碼,1-4位分機號
如:12345678901、1234-12345678-1234
"^\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*)?$" //url
/^13\d{9}$/gi手機號正則表達式
public static bool IsValidMobileNo(string MobileNo)
{
const string regPattern = @"^(130|131|132|133|134|135|136|137|138|139)\d{8}$";
return Regex.IsMatch(MobileNo, regPattern);
}
正則表達式--驗證手機號碼:13[0-9]{9}
實現手機號前帶86或是+86的情況:^((\+86)|(86))?(13)\d{9}$
電話號碼與手機號碼同時驗證:(^(\d{3,4}-)?\d{7,8})$|(13[0-9]{9})
提取信息中的網絡鏈接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的郵件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
提取信息中的圖片鏈接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
提取信息中的中國手機號碼:(86)*0*13\d{9}
提取信息中的中國固定電話號碼:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
提取信息中的中國電話號碼(包括移動和固定電話):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
提取信息中的中國郵政編碼:[1-9]{1}(\d+){5}
提取信息中的中國身份證號碼:\d{18}|\d{15}
提取信息中的整數:\d+
提取信息中的浮點數(即小數):(-?\d*)\.?\d+
提取信息中的任何數字 :(-?\d*)(\.\d+)?
提取信息中的中文字符串:[\u4e00-\u9fa5]* 或者 /^[\u4E00-\u9FA5]+$/
提取信息中的雙字節字符串 (漢字):[^\x00-\xff]*
3.舉例說明
今天遇到一個問題,這個分頁做的很簡單,就兩個按鈕, 一個“上一頁”,一個“下一頁”,前面一個label顯示“第2頁 共5頁”,現在想在顯示“第1頁 共5頁”的時候點擊“上一頁”提示“已經第一頁了啊”,當顯示“第1頁 共5頁”,點擊下一頁的時候提示“已經最后一頁了啊”,如何把字符串"第2頁 共5頁"中的數字2和5提取出來,先看代碼,
$("#ctl00_MainContent_butPre,#ctl00_MainContent_butNex").on("click", function () {
var pageString = $("#ctl00_MainContent_labCurPag").html(),
id = $(this).attr("id"),
reg = /([1-9][0-9]*)/g,
pageNumbers = pageString.match(reg),
tips = "";
if (/Pre/.test(id) && "1" == pageNumbers[0]) {
tips = "已經第一頁了啊";
}
else if (/Nex/.test(id) && pageNumbers[0] == pageNumbers[1]) {
tips = "已經最后一頁了啊";
}
if (tips) {
var d = dialog({
title: '提示',
content: tips,
});
d.show();
return false;
}
});
從w3c上看到exec是正則表達式的方法,它以字符串為參數,如下所示:返回結果是
var reg = new RegExp("abc") ;
var str = "3abc4,5abc6";
reg.exec(str );
看到這個例子的時候我覺得有戲,照葫蘆畫瓢這樣寫
var reg = new RegExp("[1-9][0-9]*", "g") ;
var str = "第2頁 共5頁";
var result = reg.exec(str );
console.log(result);
返回結果如下:

很明顯不是我想要的答案,除了當前頁我還想知道總共多少頁,就是那個5。
match是字符串執行匹配正則表達式規則的方法,它的參數是正則表達
var reg = new RegExp("abc") ;
var str = "3abc4,5abc6";
str.match(reg);
3、exec和match返回的都是數組;
如果exec執行的正則表達式沒有子表達式(小括號內的內容,如/abc(\s*)/中的(\s*) ),如果有匹配,就返回第一個匹配的字符串內容,此時的數組僅有一個元素,如果沒有匹配返回null;
var reg = new RegExp("abc") ;
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));
執行如上代碼,你會發現兩者內容均為一樣:abc,
4、如果定義正則表達對象為全局匹配如:
var reg = new RegExp("abc","g") ;
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));
則 為abc和abc,abc;因為match執行了全局匹配查詢;而exec如果沒有子表達式只會找到一個匹配的即返回。
5、當表示中含有子表達式的情況:
var reg = new RegExp("a(bc)") ;
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));
你會發現兩者執行的結果都是:abc,bc;
6、當如果正則表達式對象定義為為全局匹配
var reg = new RegExp("a(bc)","g") ;
var str = "3abc4,5abc6";
alert(reg.exec(str));
alert(str.match(reg));
則兩者返回的結果是abc,bc和abc,abc,
總結為:
1、當正則表達式無子表達式,并且定義為非全局匹配時,exec和match執行的結果是一樣,均返回第一個匹配的字符串內容;
2、當正則表達式無子表達式,并且定義為全局匹配時,exec和match執行,做存在多處匹配內容,則match返回的是多個元素數組;
3、當正則表達式有子表示時,并且定義為非全局匹配,exec和match執行的結果是一樣如上邊的第5種情況;
4、當正則表達式有子表示時,并且定義為全局匹配,exec和match執行的結果不一樣,此時match將忽略子表達式,只查找全匹配正則表達式并返回所有內容,如上第6種情況;
也就說,exec與全局是否定義無關系,而match則于全局相關聯,當定義為非全局,兩者執行結果相同。
好細微的差別啊,w3c上是不會有這么細致的介紹的,于是有了正確答案,如下:
var reg = new RegExp("[1-9][0-9]*","g") ;
var str = "第2頁 共5頁";
var result = str.match(reg);
console.log(result);
現在已經沒有研究正則表達式原理,現在只想在網上找過來看看了,下面的都是來自別人的博客。
1.正則表達式 整數
^[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)
2.另外一個版本
"^(([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*)?$" //url
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //電話號碼
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址
YYYY-MM-DD基本上把閏年和2月等的情況都考慮進去了
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$
C#正則表達式
圖片 src[^>]*[^/].(?:jpg|bmp|gif)(?:\"|\')
中文 ^([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)$
網址 "\<a.+?href=['""](?!http\:\/\/)(?!mailto\:)(?>foundAnchor>[^'"">]+?)[^>]*?\>"
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達式:(^\s*)|(\s*$)(像vbscript那樣的trim函數)
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
---------------------------------------------------------------------------
以下是例子:
利用正則表達式限制網頁表單里的文本框輸入內容:
用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
1.用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
2.用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
3.用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
4.計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
5.javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正則表達式分解和轉換IP地址:
6.下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:
function IP2V(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("不是一個正確的IP地址!")
}
}
不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
3.這位博友很細心把html代碼也貼出來了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
<script type="text/javascript" language="javascript" src="jquery.js"></script>
<script type="text/javascript" language="javascript" >
function validata(){
if($("#username").val()==""){
document.write("請輸入名字");
return false;
}
if($("#password").val()==""){
document.write("請輸入密碼");
return false;
}
if($("#telephone").val()==""){
document.write("請輸入電話號碼");
}
if($("#email").val()==""){
$("#email").val("shuangping@163.com");
}
}
function isInteger(obj){
reg=/^[-+]?\d+$/;
if(!reg.test(obj)){
$("#test").html("<b>Please input correct figures</b>");
}else{
$("#test").html("");
}
}
function isEmail(obj){
reg=/^\w{3,}@\w+(\.\w+)+$/;
if(!reg.test(obj)){
$("#test").html("<b>請輸入正確的郵箱地址</b>");
}else{
$("#test").html("");
}
}
function isString(obj){
reg=/^[a-z,A-Z]+$/;
if(!reg.test(obj)){
$("#test").html("<b>只能輸入字符</b>");
}else{
$("#test").html("");
}
}
function isTelephone(obj){
reg=/^(\d{3,4}\-)?[1-9]\d{6,7}$/;
if(!reg.test(obj)){
$("#test").html("<b>請輸入正確的電話號碼!</b>");
}else{
$("#test").html("");
}
}
function isMobile(obj){
reg=/^(\+\d{2,3}\-)?\d{11}$/;
if(!reg.test(obj)){
$("#test").html("請輸入正確移動電話");
}else{
$("#test").html("");
}
}
function isUri(obj){
reg=/^http:\/\/[a-zA-Z0-9]+\.[a-zA-Z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
if(!reg.test(obj)){
$("#test").html($("#uri").val()+"請輸入正確的inernet地址");
}else{
$("#test").html("");
}
}
//document加載完畢執行
$(document).ready(function() {
// do something here
//隔行換色功能
$("p").each(function(i){
this.style.color=['red','green','blue','black'][i%2]
});
//eq(2)獲取$("p")集合的第3個元素
$("p").eq(2).click(function(){$("#display").css("color","blue")});
//所有test中的p都附加了樣式"over"。
$("#test>p").addClass("over");
//test中的最后一個p附加了樣式"out"。
$("#test p:last").addClass("out");
//選擇同級元素還沒看懂
//$('#faq').find('dd').hide().end().find('dt').click(function()
//選擇父級元素
$("a").hover(
function(){$(this).parents("p").addClass("out")},
function(){$(this).parents("p").removeClass("out")})
//hover鼠標懸停效果,toggle每次點擊時切換要調用的函數 ,
//trigger(eventtype): 在每一個匹配的元素上觸發某類事件,
//bind(eventtype,fn),unbind(eventtype): 事件的綁定與反綁定從每一個匹配的元素中(添加)刪除綁定的事件。
//方法的連寫
$("#display").hover(function(){
$(this).addClass("over");
},function(){
$(this).removeClass("over");
})
.click(function(){alert($("#display").text())});
if($.browser.msie){//判斷瀏覽器,若是ie則執行下面的功能
//聚焦
$("input[@type=text],textarea,input[@type=password]")
.focus(function(){$(this).css({background:"white",border:"1px solid blue"})})
//也可以這樣連著寫,
//.blur(function(){$(this).css({background:"white",border:"1px solid black"})})
//失去焦點
//css樣式可以通過addClass()來添加
$("input[@type=text],textarea,input[@type=password]")
.blur(function(){$(this).css({background:"white",border:"1px solid black"});});
}
});
</script>
<style type="text/css">
.over{
font-size:large;
font-style:italic;
}
.out{
font-size:small;
}
</style>
</head>
<body >
<div id="display">demo</div>
<div id="test">
<p>adfa<a>dfasfa</a>sdfasdf</p>
<p>adfadfasfasdfasdf</p>
<p>adfadfasfasdfasdf</p>
<p>adfadfasfasdfasdf</p>
</div>
<form id="theForm">
isString<div><input type="text" id="username" onblur="isString(this.value)"/></div>
isInteger<div><input type="text" id="password" onblur="isInteger(this.value)"/></div>
isTelephone<div><input type="text" id="telephone" onblur="isTelephone(this.value)"/></div>
isMobile<div><input type="text" id="mobile" onblur="isMobile(this.value)"/></div>
isEmail<div><input type="text" id="email" onblur="isEmail(this.value)"/></div>
isUri<div><input type="text" id="uri" onblur="isUri(this.value)"/></div>
<div><input type="button" value="Validata" onclick="return validata();" /></div>
</form>
</body>
</html>
4. 用JS jquery取float型小數點后兩位
1. 最笨的辦法
function get()
{
var s = 22.127456 + “”;
var str = s.substring(0,s.indexOf(“.”) + 3);
alert(str);
}
2. 正則表達式效果不錯
<scrīpt type=”text/javascrīpt”>
onload = function(){
var a = “23.456322″;
var aNew;
var re = /([0-9]+\.[0-9]{2})[0-9]*/;
aNew = a.replace(re,”$1″);
alert(aNew);
}
</scrīpt>
3. 他就比較聰明了…..
<scrīpt>
var num=22.127456; alert( Math.round(num*100)/100);
</scrīpt>
4.會用新鮮東西的朋友……. 但是需要 IE5.5+才支持。
<scrīpt>
var num=22.127456; alert( num.toFixed(2));
</scrīpt>
參考鏈接:
http://www.rzrgm.cn/freexiaoyu/archive/2008/12/17/1356690.html
http://www.rzrgm.cn/qyz123/archive/2007/05/12/743537.html
http://www.rzrgm.cn/luluping/archive/2008/05/04/1181434.html
關鍵字:js驗證表單大全,用JS控制表單提交 ,javascript提交表單:
目錄:
1:js 字符串長度限制、判斷字符長度 、js限制輸入、限制不能輸入、textarea 長度限制
2.:js判斷漢字、判斷是否漢字 、只能輸入漢字
3:js判斷是否輸入英文、只能輸入英文
4:js只能輸入數字,判斷數字、驗證數字、檢測數字、判斷是否為數字、只能輸入數字
5:只能輸入英文字符和數字
6: js email驗證 、js 判斷email 、信箱/郵箱格式驗證
7:js字符過濾,屏蔽關鍵字
8:js密碼驗證、判斷密碼
2.1: js 不為空、為空或不是對象 、判斷為空 、判斷不為空
2.2:比較兩個表單項的值是否相同
2.3:表單只能為數字和"_",
2.4:表單項輸入數值/長度限定
2.5:中文/英文/數字/郵件地址合法性判斷
2.6:限定表單項不能輸入的字符
2.7表單的自符控制
2.8:form文本域的通用校驗函數
1. 長度限制
<script>
function test()
{
if(document.a.b.value.length>50)
{
alert("不能超過50個字符!");
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
<input type="submit" name="Submit" value="check">
</form>
2. 只能是漢字
<input onkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">
3." 只能是英文
<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnvalue=false;
}
</script>
<input onkeydown="onlyEng();">
4. 只能是數字
<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
//考慮小鍵盤上的數字鍵
event.returnvalue=false;
}
</script>
<input onkeydown="onlyNum();">
5. 只能是英文字符和數字
<input onkeyup="value="/oblog/value.replace(/[\W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">
6. 驗證油箱格式
<SCRIPT LANGUAGE=javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
return true;
else
alert("oh");
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>
7. 屏蔽關鍵字(這里屏蔽***和****)
<script language="javascript1.2">
function test() {
if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
alert(":)");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>
8. 兩次輸入密碼是否相同
<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test" onclick="check()">
</FORM>
<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>
夠了吧 :)
屏蔽右鍵 很酷
oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
加在body中
二
2.1 表單項不能為空
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("請輸入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>
2.2 比較兩個表單項的值是否相同
<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您兩次輸入的密碼不一樣!請重新輸入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>
2.3 表單項只能為數字和"_",用于電話/銀行帳號驗證上,可擴展到域名注冊等
<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可輸入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的電話號碼不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>
2.4 表單項輸入數值/長度限定
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert("輸入數值不能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert("輸入文字小于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>
2.5 中文/英文/數字/郵件地址合法性判斷
<SCRIPT LANGUAGE="javascript">
<!--
function isEnglish(name) //英文值檢測
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}
function isChinese(name) //中文值檢測
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}
function isMail(name) // E-mail值檢測
{
if(! isEnglish(name))
return false;
i = name.indexOf(" at ");
j = name dot lastIndexOf(" at ");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}
function isNumber(name) //數值檢測
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}
function CheckForm()
{
if(! isMail(form.Email.value)) {
alert("您的電子郵件不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert("英文名不合法!");
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert("中文名不合法!");
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert("郵政編碼不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>
2.6 限定表單項不能輸入的字符
<script language="javascript">
<!--
function contain(str,charset)// 字符串包含測試函數
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}
function CheckForm()
{
if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))
{
alert("輸入了非法字符");
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>
1. 檢查一段字符串是否全由數字組成
---------------------------------------
<script language="Javascript"><!--
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
2. 怎么判斷是否是字符
---------------------------------------
if (/[^\x00-\xff]/g.test(s)) alert("含有漢字");
else alert("全是字符");
4. 郵箱格式驗證
---------------------------------------
//函數名:chkemail
//功能介紹:檢查是否為Email Address
//參數說明:要檢查的字符串
//返回值:0:不是 1:是
function chkemail(a)
{ var i=a.length;
var temp = a.indexOf('@');
var tempd = a.indexOf('.');
if (temp > 1) {
if ((i-temp) > 3){
if ((i-tempd)>0){
return 1;
}
}
}
return 0;
}
5. 數字格式驗證
---------------------------------------
//函數名:fucCheckNUM
//功能介紹:檢查是否為數字
//參數說明:要檢查的數字
//返回值:1為是數字,0為不是數字
function fucCheckNUM(NUM)
{
var i,j,strTemp;
strTemp="0123456789";
if ( NUM.length== 0)
return 0
for (i=0;i<NUM.length;i++)
{
j=strTemp.indexOf(NUM.charAt(i));
if (j==-1)
{
//說明有字符不是數字
return 0;
}
}
//說明是數字
return 1;
}
6. 電話號碼格式驗證
---------------------------------------
//函數名:fucCheckTEL
//功能介紹:檢查是否為電話號碼
//參數說明:要檢查的字符串
//返回值:1為是合法,0為不合法
function fucCheckTEL(TEL)
{
var i,j,strTemp;
strTemp="0123456789-()# ";
for (i=0;i<TEL.length;i++)
{
j=strTemp.indexOf(TEL.charAt(i));
if (j==-1)
{
//說明有字符不合法
return 0;
}
}
//說明合法
return 1;
}
7. 判斷輸入是否為中文的函數
---------------------------------------
function ischinese(s){
var ret=true;
for(var i=0;i<s.length;i++)
ret=ret && (s.charCodeAt(i)>=10000);
return ret;
}
8. 綜合的判斷用戶輸入的合法性的函數
---------------------------------------
<script language="javascript">
//限制輸入字符的位數開始
//m是用戶輸入,n是要限制的位數
function issmall(m,n)
{
if ((m<n) && (m>0))
{
return(false);
}
else
{return(true);}
}
9. 判斷密碼是否輸入一致
---------------------------------------
function issame(str1,str2)
{
if (str1==str2)
{return(true);}
else
{return(false);}
}
10. 判斷用戶名是否為數字字母下滑線
---------------------------------------
function notchinese(str){
var reg=/[^A-Za-z0-9_]/g
if (reg.test(str)){
return (false);
}else{
return(true); }
}
11.驗證手機號
function validatemobile(mobile)
{
if(mobile.length==0)
{
alert('請輸入手機號碼!');
document.form1.mobile.focus();
return false;
}
if(mobile.length!=11)
{
alert('請輸入有效的手機號碼!');
document.form1.mobile.focus();
return false;
}
var myreg = /^(((13[0-9]{1})|159|153)+\d{8})$/;
if(!myreg.test(mobile))
{
alert('請輸入有效的手機號碼!');
document.form1.mobile.focus();
return false;
}
}
或者
if(!/^(13[0-9]|14[0-9]|15[0-9]|18[0-9])\d{8}$/i.test(mobile))
或者
代碼如下:
function Checkreg()
{
//驗證電話號碼手機號碼,包含153,159號段
if (document.form.phone.value=="" && document.form.UserMobile.value==""){
alert("電話號碼和手機號碼至少選填一個阿!");
document.form.phone.focus();
return false;
}
if (document.form.phone.value != ""){
var phone=document.form.phone.value;
var p1 = /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/;
var me = false;
if (p1.test(phone))me=true;
if (!me){
document.form.phone.value='';
alert('對不起,您輸入的電話號碼有錯誤。區號和電話號碼之間請用-分割');
document.form.phone.focus();
return false;
}
}
if (document.form.UserMobile.value != ""){
var mobile=document.form.UserMobile.value;
var reg0 = /^13\d{5,9}$/;
var reg1 = /^153\d{4,8}$/;
var reg2 = /^159\d{4,8}$/;
var reg3 = /^0\d{10,11}$/;
var my = false;
if (reg0.test(mobile))my=true;
if (reg1.test(mobile))my=true;
if (reg2.test(mobile))my=true;
if (reg3.test(mobile))my=true;
if (!my){
document.form.UserMobile.value='';
alert('對不起,您輸入的手機或小靈通號碼有錯誤。');
document.form.UserMobile.focus();
return false;
}
return true;
}
}
說明
test方法檢查在字符串中是否存在一個模式,如果存在則返回 true,否則就返回 false。
正則表達式部分:
\d 代表一個數字
{7,8} 代表7-8位數字(表示電話號碼)
{3,} 代表分機號碼
d{2,3} 代表區號
\+]\d{2,3} 代表國際區號
^13\d{5,9}$/ //130?139。至少5位,最多9位
/^153\d{4,8}$/ //聯通153。至少4位,最多8位
/^159\d{4,8}$/ //移動159。至少4位,最多8位
第二個:
復制代碼 代碼如下:
var Mobile = $("#varMobilePhone").val();
var Phone = $("#varPhoneNo").val();
if (Mobile == ""&&Phone == "")
{
alert("手機和固話,請至少填寫一項聯系方式!");
$("#varMobilePhone").focus();
return;
}
if(Mobile!="")
{
if(!isMobil(Mobile))
{
alert("請輸入正確的手機號碼!");
$("#varMobilePhone").focus();
return; }
}
//手機號碼驗證信息
function isMobil(s)
{
var patrn = /(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/;
if (!patrn.exec(s))
{
return false;
} return true; }
后臺驗證如下:
if (model.Zip != null)
{
if (!Common.PageValidate.IsValidate(model.Zip,"^\\d{6}$"))
{ Common.WebMessage.showMsg(HttpContext.Current, "請輸入正確郵編");
return;
}
}
if (model.PhoneNo != null)
{
if (!Common.PageValidate.IsValidate(model.PhoneNo, "\\d{3}-\\d{8}|\\d{4}-\\d{7}"))
{
Common.WebMessage.showMsg(HttpContext.Current, "請輸入正確的電話號碼!");
return;
}
}
if (model.MobilePhone != null)
{
if (!Common.PageValidate.IsValidate(model.MobilePhone, "^0{0,1}(13[0-9]|15[3-9]|15[0-2]|18[0-9])[0-9]{8}$"))
{
Common.WebMessage.showMsg(HttpContext.Current, "請輸入正確11位有效的手機號碼!");
return;
}
}
match 方法
使用正則表達式模式對字符串執行查找,并將包含查找的結果作為數組返回。
stringObj.match(rgExp)
參數
stringObj
必選項。對其進行查找的 String 對象或字符串文字。
rgExp
必選項。為包含正則表達式模式和可用標志的正則表達式對象。也可以是包含正則表達式模式和可用標志的變量名或字符串文字。
其余說明與exec一樣,不同的是如果match的表達式匹配了全局標記g將出現所有匹配項,而不用循環,但所有匹配中不會包含子匹配項。
例子1:
function MatchDemo(){ var r, re; // 聲明變量。 var s = "The rain in Spain falls mainly in the plain"; re = /(a)in/ig; // 創建正則表達式模式。 r = s.match(re); // 嘗試去匹配搜索字符串。 document.write(r); // 返回的數組包含了所有 "ain" 出現的四個匹配,r[0]、r[1]、r[2]、r[3]。 // 但沒有子匹配項a。}輸出結果:ain,ain,ain,ain
exec 方法
用正則表達式模式在字符串中查找,并返回該查找結果的第一個值(數組),如果匹配失敗,返回null。
rgExp.exec(str)
參數
rgExp
必選項。包含正則表達式模式和可用標志的正則表達式對象。
str
必選項。要在其中執行查找的 String 對象或字符串文字。
返回數組包含:
input:整個被查找的字符串的值;
index:匹配結果所在的位置(位);
lastInput:下一次匹配結果的位置;
arr:結果值,arr[0]全匹配結果,arr[1,2...]為表達式內()的子匹配,由左至右為1,2...。
例子2:
代碼如下:
function RegExpTest(){
var re = /\w+/g; // 注意g將全文匹配,不加將永遠只返回第一個匹配。
var arr;
while((arr = re.exec(src)) !=null){ //exec使arr返回匹配的第一個,while循環一次將使re在g作用尋找下一個匹配。
document.write(arr.index + "-" + arr.lastIndex + ":" + arr + "<br/>");
for(key in arr){
document.write(key + "=>" + arr[key] + "<br/>");
}
document.write("<br/>");
}
}
window.onload = RegExpTest();
輸出結果:
0-1:I //0為index,i所在位置,1為下一個匹配所在位置
input=>I love you!
index=>0
lastIndex=>1
0=>I
2-6:love
input=>I love you!
index=>2
lastIndex=>6
0=>love
7-10:you
input=>I love you!
index=>7
lastIndex=>10
0=>you
說 明:根據手冊,exec只返回匹配結果的第一個值,比如上例如果不用while循環,將只返回'I'(盡管i空格后的love和you都符合表達式),無 論re表達式用不用全局標記g。但是如果為正則表達式設置了全局標記g,exec 從以 lastIndex 的值指示的位置開始查找。如果沒有設置全局標志,exec 忽略 lastIndex 的值,從字符串的起始位置開始搜索。利用這個特點可以反復調用exec遍歷所有匹配,等價于match具有g標志。
當然,如果正則表達式忘記用g,而又用循環(比如:while、for等),exec將每次都循環第一個,造成死循環。
exec的輸出將包含子匹配項。
例子3:
function execDemo(){
var r, re; // 聲明變量。
var s = "The rain in Spain falls mainly in the plain";
re = /[\w]*(ai)n/ig;
r = re.exec(s);
document.write(r + "<br/>");
for(key in r){
document.write(key + "-" + r[key] + "<br/>");
}
}
window.onload = execDemo();
輸出:
rain,ai
input-The rain in Spain falls mainly in the plain
index-4
lastIndex-8
0-rain
1-ai
test 方法
返回一個 Boolean 值,它指出在被查找的字符串中是否匹配給出的正則表達式。
rgexp.test(str)
參數
rgexp
必選項。包含正則表達式模式或可用標志的正則表達式對象。
str
必選項。要在其上測試查找的字符串。
說明
test 方法檢查字符串是否與給出的正則表達式模式相匹配,如果是則返回 true,否則就返回 false。
例子4:
function TestDemo(re, s){
var s1;
if (re.test(s))
s1 = " 匹配正則式 ";
else
s1 = " 不匹配正則式 ";
return("'" + s + "'" + s1 + "'"+ re.source + "'");
}
window.onload = document.write(TestDemo(/ab/,'cdef'));
輸出結果:'cdef' 不匹配正則式 'ab'
注意:test()繼承正則表達式的lastIndex屬性,表達式在匹配全局標志g的時候須注意。
例子5:
function testDemo(){
var r, re; // 聲明變量。
var s = "I";
re = /I/ig; // 創建正則表達式模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.test(s) + "<br/>");
document.write(re.test(s));
}
testDemo();
輸出結果:
true
false
true
當第二次調用test()的時候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。下例顯示test的lastIndex屬性:
例子6:
function testDemo(){
var r, re; // 聲明變量。
var s = "I";
re = /I/ig; // 創建正則表達式模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.lastIndex); // 返回 Boolean 結果。
}
testDemo();
輸出:
true
1
解決方法:將test()的lastIndex屬性每次重新指向0,re.lastIndex = 0;
search 方法
返回與正則表達式查找內容匹配的第一個子字符串的位置(偏移位)。
stringObj.search(rgExp)
參數
stringObj
必選項。要在其上進行查找的 String 對象或字符串文字。
rgExp
必選項。包含正則表達式模式和可用標志的正則表達式對象。
說明:如果找到則返回子字符至開始處的偏移位,否則返回-1。
例子6:
function SearchDemo(){
var r, re; // 聲明變量。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i; // 創建正則表達式模式。
re2 = /tom/i;
r = s.search(re); // 查找字符串。
r2 = s.search(re2);
return("r:" + r + ";r2:" + r2); // 返回 Boolean 結果。
}
document.write(SearchDemo());
輸出:r:18;r2:-1
replace 方法
返回根據正則表達式進行文字替換后的字符串的復制。
stringObj.replace(rgExp, replaceText)
參數
stringObj
必選項。要執行該替換的 String 對象或字符串文字。該字符串不會被 replace 方法修改。
rgExp
必選項。為包含正則表達式模式或可用標志的正則表達式對象。也可以是 String 對象或文字。如果 rgExp 不是正則表達式對象,它將被轉換為字符串,并進行精確的查找;不要嘗試將字符串轉化為正則表達式。
replaceText
必選項。是一個String 對象或字符串文字,對于stringObj 中每個匹配 rgExp 中的位置都用該對象所包含的文字加以替換。在 Jscript 5.5 或更新版本中,replaceText 參數也可以是返回替換文本的函數。
說明
replace 方法的結果是一個完成了指定替換的 stringObj 對象的復制。意思為匹配的項進行指定替換,其它不變作為StringObj的原樣返回。
ECMAScript v3 規定,replace() 方法的參數 replacement 可以是函數而不是字符串。在這種情況下,每個匹配都調用該函數,它返回的字符串將作為替換文本使用。該函數的第一個參數是匹配模式的字符串。接下來的參數 是與模式中的子表達式匹配的字符串,可以有 0 個或多個這樣的參數。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置。最后一個參數是 stringObject 本身。結果為將每一匹配的子字符串替換為函數調用的相應返回值的字符串值。函數作參可以進行更為復雜的操作。
例子7:
function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 說明華氏溫度可能模式有:123F或123.4F。注意,這里用了g模式
return(s.replace
(test,
function(Regstr,$1,$2,$3,newstrObj) {
return(("<br/>" + Regstr +"<br/>" + ($1-32) * 1/2) + "C" +"<br/>" + //以下兩行進行替換
$2 +"<br/>" + $3 +"<br/>" + newstrObj +"<br/>" );
}
)
);
}
document.write(f2c("Water: 32.2F and Oil: 20.30F."));
輸出結果:
Water: //不與正則匹配的字符,按原字符輸出
32.2F //與正則相匹配的第一個字符串的原字符串 Regstr
0.10000000000000142C //與正則相匹配的第一個字符串的第一個子模式匹配的替換結果 $1
.2 //與正則相匹配的第一個字符串的第二個子模式匹配項的替換結果,這里我們沒有將它替換 $2
7 //與正則相匹配的第一個字符串的第一個子匹配出現的偏移量 $3
Water: 32.2F and Oil: 20.30F. //原字符串 newstrObj
and Oil: //不與正則匹配的字符
20.30F //與正則相匹配的第二個字符串的原字符串
-5.85C //與正則相匹配的第二個字符串的第一個子模式與匹配的替換結果
.30 //與正則相匹配的第二個字符串的第二個子模式匹配項的替換結果,這里我們沒有將它替換
22 //與正則相匹配的第二個字符串的第一個子匹配出現的偏移量
Water: 32.2F and Oil: 20.30F. //原字符串
. //不與正則匹配的字符
上面的函數參數我們全部用到了。在實際中,我們只須用將xxF替換為xxC,根據要求,我們無須寫這么多參數。
例子8:
function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 說明華氏溫度可能模式有:123F或123.4F
return(s.replace
(test,
function(strObj,$1) {
return((($1-32) * 1/2) + "C");
}
)
);
}
document.write(f2c("Water: 32.2F and Oil: 20.30F."));
輸出:Water: 0.10000000000000142C and Oil: -5.85C.
更多的應用:
例子9:
function f2c(s) {
var test = /([\d]{4})-([\d]{1,2})-([\d]{1,2})/;
return(s.replace
(test,
function($0,$1,$2,$3) {
return($2 +"/" + $1);
}
)
);
}
document.write(f2c("today: 2011-03-29"));
輸出:today: 03/2011
split 方法
將一個字符串分割為子字符串,然后將結果作為字符串數組返回。
stringObj.split([separator[, limit]])
參數
stringObj
必選項。要被分解的 String 對象或文字。該對象不會被 split 方法修改。
separator
可選項。字符串或 正則表達式 對象,它標識了分隔字符串時使用的是一個還是多個字符。如果忽略該選項,返回包含整個字符串的單一元素數組。
limit
可選項。該值用來限制返回數組中的元素個數。
說明
split 方法的結果是一個字符串數組,在 stingObj 中每個出現 separator 的位置都要進行分解。separator 不作為任何數組元素的部分返回。
例子10:
function SplitDemo(){
var s, ss;
var s = "The rain in Spain falls mainly in the plain.";
// 正則表達式,用不分大不寫的s進行分隔。
ss = s.split(/s/i);
return(ss);
}
document.write(SplitDemo());
輸出:The rain in ,pain fall, mainly in the plain.
js正則表達式之exec()方法、match()方法以及search()方法
先看代碼:
var sToMatch = "test, Tes, tst, tset, Test, Tesyt, sTes";
var reEs = /es/gi;
alert(reEs.exec(sToMatch));
alert(sToMatch.match(reEs));
alert(sToMatch.search(reEs));
三個彈出框內容如下:



結果分析如下:
1、RegExp的exec()方法,有一個字符串參數,返回一個數組,數組的第一個條目是第一個匹配;其他的是反向引用。所以第一個返回的結果是第一個匹配的值es(不區分大小寫)。
2、String對象有一個match()方法,它返回一個包含在字符串中所有匹配的數據。這個方法調用string對象,同時傳給它一個RegExp對象。所以第二個彈出語句返回的是所有符合正則表達式的數組。
3、search()的字符串方法與indexOf()有些類似,但是它使用一個RegExp對象而非僅僅一個子字符串。search()方法返回 第一個匹配值的位置。所以第三處彈出的是“1”,即第二個字符就匹配了。注意的是search()方法不支持全局匹配正規表達式(帶參數g)。
var tel = /(^[0-9]{3,4}\-[0-9]{7,8}$)|(^[0-9]{7,8}$)|(^[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)|(13\d{9}$)|(15[0135-9]\d{8}$)|(18[267]\d{8}$)/;
var phone = document.getElementById("phoneNumber").value;
if(phone != "" && phone.replace(/\s/g,"")!="" && !(tel.exec(phone))) {
alert("電話號碼格式不對,正確格式如下:\n座機號碼:區號-座機號碼(或)\n手機號碼:11位手機號碼");
return false;
}
var temp = document.getElementById("email").value;
var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
if(temp.value!=""){
if(!myreg.test(temp) && temp !="" && temp.replace(/\s/g,"")!=""){
alert("email格式不正確,請重新輸入!");
//email.focus();
return false;
}
}
驗證銀行卡號
//銀行卡號校驗
//Description: 銀行卡號Luhm校驗
//Luhm校驗規則:16位銀行卡號(19位通用):
// 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位于奇數位號上的數字乘以 2。
// 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。
// 3.將加法和加上校驗位能被 10 整除。
function luhmCheck(bankno){
if (bankno.length < 16 || bankno.length > 19) {
//$("#banknoInfo").html("銀行卡號長度必須在16到19之間");
return false;
}
var num = /^\d*$/; //全數字
if (!num.exec(bankno)) {
//$("#banknoInfo").html("銀行卡號必須全為數字");
return false;
}
//開頭6位
var strBin="10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99";
if (strBin.indexOf(bankno.substring(0, 2))== -1) {
//$("#banknoInfo").html("銀行卡號開頭6位不符合規范");
return false;
}
var lastNum=bankno.substr(bankno.length-1,1);//取出最后一位(與luhm進行比較)
var first15Num=bankno.substr(0,bankno.length-1);//前15或18位
var newArr=new Array();
for(var i=first15Num.length-1;i>-1;i--){ //前15或18位倒序存進數組
newArr.push(first15Num.substr(i,1));
}
var arrJiShu=new Array(); //奇數位*2的積 <9
var arrJiShu2=new Array(); //奇數位*2的積 >9
var arrOuShu=new Array(); //偶數位數組
for(var j=0;j<newArr.length;j++){
if((j+1)%2==1){//奇數位
if(parseInt(newArr[j])*2<9)
arrJiShu.push(parseInt(newArr[j])*2);
else
arrJiShu2.push(parseInt(newArr[j])*2);
}
else //偶數位
arrOuShu.push(newArr[j]);
}
var jishu_child1=new Array();//奇數位*2 >9 的分割之后的數組個位數
var jishu_child2=new Array();//奇數位*2 >9 的分割之后的數組十位數
for(var h=0;h<arrJiShu2.length;h++){
jishu_child1.push(parseInt(arrJiShu2[h])%10);
jishu_child2.push(parseInt(arrJiShu2[h])/10);
}
var sumJiShu=0; //奇數位*2 < 9 的數組之和
var sumOuShu=0; //偶數位數組之和
var sumJiShuChild1=0; //奇數位*2 >9 的分割之后的數組個位數之和
var sumJiShuChild2=0; //奇數位*2 >9 的分割之后的數組十位數之和
var sumTotal=0;
for(var m=0;m<arrJiShu.length;m++){
sumJiShu=sumJiShu+parseInt(arrJiShu[m]);
}
for(var n=0;n<arrOuShu.length;n++){
sumOuShu=sumOuShu+parseInt(arrOuShu[n]);
}
for(var p=0;p<jishu_child1.length;p++){
sumJiShuChild1=sumJiShuChild1+parseInt(jishu_child1[p]);
sumJiShuChild2=sumJiShuChild2+parseInt(jishu_child2[p]);
}
//計算總和
sumTotal=parseInt(sumJiShu)+parseInt(sumOuShu)+parseInt(sumJiShuChild1)+parseInt(sumJiShuChild2);
//計算Luhm值
var k= parseInt(sumTotal)%10==0?10:parseInt(sumTotal)%10;
var luhm= 10-k;
if(lastNum==luhm){
$("#banknoInfo").html("Luhm驗證通過");
return true;
}
else{
$("#banknoInfo").html("銀行卡號必須符合Luhm校驗");
return false;
}
}
郵箱驗證 var reg_email=/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/;
驗證手機號
/*
根據〖中華人民共和國國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
地址碼表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼。
出生日期碼表示編碼對象出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。
順序碼表示同一地址碼所標識的區域范圍內,對同年、月、日出生的人員編定的順序號。順序碼的奇數分給男性,偶數分給女性。
校驗碼是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。
出生日期計算方法。
15位的身份證編碼首先把出生年擴展為4位,簡單的就是增加一個19或18,這樣就包含了所有1800-1999年出生的人;
2000年后出生的肯定都是18位的了沒有這個煩惱,至于1800年前出生的,那啥那時應該還沒身份證號這個東東,⊙﹏⊙b汗...
下面是正則表達式:
出生日期1800-2099 (18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])
身份證正則表達式 /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
15位校驗規則 6位地址編碼+6位出生日期+3位順序號
18位校驗規則 6位地址編碼+8位出生日期+3位順序號+1位校驗位
校驗位規則 公式:∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示號碼字符從由至左包括校驗碼在內的位置序號;
ai----表示第i位置上的號碼字符值;
Wi----示第i位置上的加權因子,其數值依據公式Wi=2^(n-1)(mod 11)計算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
*/
//身份證號合法性驗證
//支持15位和18位身份證號
//支持地址編碼、出生日期、校驗位驗證
function IdentityCodeValid(code) {
var city={11:"北京",12:"天津",13:"河北",14:"山西",15:"內蒙古",21:"遼寧",22:"吉林",23:"黑龍江 ",31:"上海",32:"江蘇",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山東",41:"河南",42:"湖北 ",43:"湖南",44:"廣東",45:"廣西",46:"海南",50:"重慶",51:"四川",52:"貴州",53:"云南",54:"西藏 ",61:"陜西",62:"甘肅",63:"青海",64:"寧夏",65:"新疆",71:"臺灣",81:"香港",82:"澳門",91:"國外 "};
var tip = "";
var pass= true;
if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)){
tip = "身份證號格式錯誤";
pass = false;
}
else if(!city[code.substr(0,2)]){
tip = "地址編碼錯誤";
pass = false;
}
else{
//18位身份證需要驗證最后一位校驗位
if(code.length == 18){
code = code.split('');
//∑(ai×Wi)(mod 11)
//加權因子
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
//校驗位
var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
var sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++)
{
ai = code[i];
wi = factor[i];
sum += ai * wi;
}
var last = parity[sum % 11];
if(parity[sum % 11] != code[17]){
tip = "校驗位錯誤";
pass =false;
}
}
}
if(!pass) alert(tip);
return pass;
}
var c = '130981199312253466';
var res= IdentityCodeValid(c);
// 匹配手機號首尾,以類似“123****8901”的形式輸出
'12345678901'.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
此段正則匹配字符串中的連續11位數字,替換中間4位為*號,輸出常見的隱匿手機號的格式。如果要僅得到末尾4位,則可以改成如下形式:
// 匹配連續11位數字,并替換其中的前7位為*號
'15110280327'.replace(/\d{7}(\d{4})/, '*******$1');
補充注釋:正則表達式中的括號即可用于分組,同時也用于定義子模式串,在replace()方法中,參數二中可以使用$n(n為數字)來依次引用模式串中用括號定義的字串。
$("#name").html(user.name.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')); 隱藏手機號中間4位
常見正則表達式驗證
export const regExpConfig = { IDcard: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/, // 身份證 mobile: /^1([3|4|5|7|8|])\d{9}$/, // 手機號碼 telephone: /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/, // 固定電話 num: /^[0-9]*$/, // 數字 phoneNo: /(^1([3|4|5|7|8|])\d{9}$)|(^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$)/, // 電話或者手機 policeNo: /^[0-9A-Za-z]{4,10}$/, // 賬號4-10位數字或字母組成 pwd: /^[0-9A-Za-z]{6,16}$/, // 密碼由6-16位數字或者字母組成 isNumAlpha: /^[0-9A-Za-z]*$/, // 字母或數字 isAlpha: /^[a-zA-Z]*$/, // 是否字母 isNumAlphaCn: /^[0-9a-zA-Z\u4E00-\uFA29]*$/, // 是否數字或字母或漢字 isPostCode: /^[\d-]*$/i, // 是否郵編 isNumAlphaUline: /^[0-9a-zA-Z_]*$/, // 是否數字、字母或下劃線 isNumAndThanZero: /^([1-9]\d*(\.\d+)?|0)$/, // 是否為整數且大于0/^[1-9]\d*(\.\d+)?$/ isNormalEncode: /^(\w||[\u4e00-\u9fa5]){0,}$/, // 是否為非特殊字符(包括數字字母下劃線中文) isTableName: /^[a-zA-Z][A-Za-z0-9#$_-]{0,29}$/, // 表名 isInt: /^-?\d+$/, // 整數 isTableOtherName: /^[\u4e00-\u9fa5]{0,20}$/, // 別名 // isText_30: /^(\W|\w{1,2}){0,15}$/, // 正則 // isText_20: /^(\W|\w{1,2}){0,10}$/, // 正則 isText_30: /^(\W|\w{1}){0,30}$/, // 匹配30個字符,字符可以使字母、數字、下劃線、非字母,一個漢字算1個字符 isText_50: /^(\W|\w{1}){0,50}$/, // 匹配50個字符,字符可以使字母、數字、下劃線、非字母,一個漢字算1個字符 isText_20: /^(\W|\w{1}){0,20}$/, // 匹配20個字符,字符可以使字母、數字、下劃線、非字母,一個漢字算1個字符 isText_100: /^(\W|\w{1}){0,100}$/, // 匹配100個字符,字符可以使字母、數字、下劃線、非字母,一個漢字算1個字符 isText_250: /^(\W|\w{1}){0,250}$/, // 匹配250個字符,字符可以使字母、數字、下劃線、非字母,一個漢字算1個字符 isNotChina: /^[^\u4e00-\u9fa5]{0,}$/, // 不為中文 IDcard: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/, // 身份證 IDcardAndAdmin: /^(([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X))|(admin))$/, // 身份證或者是admin賬號 IDcardTrim: /^\s*(([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3})|([1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X))|(admin))\s*$/, // 身份證 num1: /^[1-9]*$/, // 數字 companyNO: /^qqb_[0-9a-zA-Z_]{1,}$/, // 公司人員賬號 imgType: /image\/(png|jpg|jpeg|gif)$/, // 上傳圖片類型 isChina: /^[\u4e00-\u9fa5]{2,8}$/, isNozeroNumber: /^\+?[1-9]\d*$/, // 大于零的正整數 float: /^\d+(\.?|(\.\d+)?)$/, // 匹配正整數或者小數 或者0.這個特殊值 }
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號