字符 | 含意 | \ | 做为转意,即通常在"\"后面的字符不按原来意义解释,如/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-M | \d | 匹配一个字数字符,/\d/ = /[0-9]/ | \D | 匹配一个非字数字符,/\D/ = /[^0-9]/ | \n | 匹配一个换行符 | \r | 匹配一个回车符 | \s | 匹配一个空白字符,包括\n,\r,\f,\t,\v等 | \S | 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ | \t | 匹配一个制表符 | \v | 匹配一个重直制表符 | \w | 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] | \W | 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。 |
正则表达式是一个描述字符模式的对象。 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, \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+java\s+/ //匹配字符串"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 (fun\w*) /
对正则表达式中前一子表达式的引用所指定的并不是那个子表达式的模式,而是与那个模式相匹配的文本.这样,引用就不只是帮助你输入正则表达式的重复部分的快
捷方式了,它还实施了一条规约,那就是一个字符串各个分离的部分包含的是完全相同的字符.例如:下面的正则表达式匹配的就是位于单引号或双引号之内的所有字
符.但是,它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号): /[' "] [^ ' "]*[' "]/
如果要求开始和结束的引号匹配,我们可以使用如下的引用: /( [' "] ) [^ ' "] * \1/
\1匹配的是第一个代括号的子表达式所匹配的模式.在这个例子中,它实施了一种规约,那就是开始的引号必须和结束的引号相匹配.注意,如果反斜杠后跟随的数字比
代括号的子表达式数多,那么它就会被解析为一个十进制的转义序列,而不是一个引用.你可以坚持使用完整的三个字符来表示转义序列,这们就可以避免混淆了.例如,
使用 \044,而不是\44.下面是正则表达式的选择、分组和引用字符:
字符 含义 ____________________________________________________________________ | 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式 (...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引
用使用 \n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数 ____________________________________________________________________
5.指定匹配的位置
我们已经看到了,一个正则表达式中的许多元素才能够匹配字符串的一个字符.例如: \s 匹配的只是一个空白符.还有一些正则表达式的元素匹配的是字符之间宽度为
0的空间,而不是实际的字符例如: \b 匹配的是一个词语的边界,也就是处于一个/w字字符和一个\w非字字符之间的边界.像\b 这样的字符并不指定任何一个匹配了的
字符串中的字符,它们指定的是匹配所发生的合法位置.有时我们称这些元素为正则表达式的锚.因为它们将模式定位在检索字符串中的一个特定位置.最常用的锚元
素是 ^, 它使模式依赖于字符串的开头,而锚元素$则使模式定位在字符串的末尾.
例如:要匹配词 "javascript" ,我们可以使用正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词自身 (不像在"javascript" 中那样作为前缀),那么我们可以使
用模式 /\s java \s /, 它要求在词语java之前和之后都有空格.但是这样作有两个问题.第一: 如果 "java" 出现在一个字符的开头或者是结尾.该模式就不会与之匹配,除
非在开头和结尾处有一个空格. 第二: 当这个模式找到一个与之匹配的字符时,它返回的匹配的字符串前端和后端都有空格,这并不是我们想要的.因此,我们使用词语
的边界 \b 来代替真正的空格符 \s 进行匹配. 结果表达式是 /\b java \b/. 下面是正则表达式的锚字符:
字符 含义 ____________________________________________________________________ ^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头 $ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾 \b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符) \B 匹配的是非词语的边界的字符 _____________________________________________________________________
6.属性
有关正则表达式的语法还有最后一个元素,那就是正则表达式的属性,它说明的是高级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它
们不出现在两个斜杠之间,而是位于第二个斜杠之后.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; } |
|
| 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*)?$" //url |
|
关于验证的三个正则表达式方法使用正则表达式的主要有字符串的方法match,正则表达式的方法exec,test正则表达式方法test测试给定的字符串是否满足正则表达式,返回值是bool类型的,只有真和假,如果只是单纯的判断,不需要其他的处理,可以使用尤其是验证时。 function test(){ var text="index.aspx?test=1&ww=2&www=3"; // var re =/\?(\w{1,}=\w{1,}&){1,}\w{1,}=\w{1,}/; // var re =new RegExp("\\?(\\w{1,}=\\w{1,}&){1,}\\w{1,}=\\w{1,}"); var result= re.test(text); if(result) { alert("ok"); }else { alert("err"); }
}
正则表达式方法exec测试给定的字符串是否满足正则表达式,返回匹配到的字符串,如果没有匹配的则返回null,和test基本一致,如果需要获取匹配的各个子字符串,可以使用下标的方式,把上边的test的例子可以改写如下 function test(){ var text="index.aspx?test=1&ww=2&www=3"; var re = /\?(\w{1,}=\w{1,}&){1,}\w{1,}=\w{1,}/; // var re =new RegExp( "\\?(\\w{1,}=\\w{1,}&){1,}\\w{1,}=\\w{1,}"); var result= re.exec(text); if(result) { alert("ok"); alert(result); // 是?test=1&ww=2&www=3,ww=2& alert(result[0]+",0");//是?test=1&ww=2&www=3 alert(result[1]+",1");//是ww=2& }else { alert("err"); }
}
match其实是字符串的方法,但参数确是一个正则表达式,把上边的例子改写后,如下 function test(){ var text="index.aspx?test=1&ww=234"; // var re = /\?(\w{1,}=\w{1,}&){1,}\w{1,}=\w{1,}/; // var re2 = "(\\w{1,}=\\w{1,}&){1,}\\w{1,}=\\w{1,}" var result= text.match(re); if(result) { alert(result);//?test=1&ww=234,test=1& alert(result[0]+",0");//?test=1&ww=234 alert(result[1]+",1");//test=1& }else { alert("err"); } }
其实字符串类还有多个函数可以传递正则表达式,split,search,replace等但这些方法已经不适合验证了。 function test(){ var text="index.aspx?test=1&ww=234"; // var re = /\?(\w{1,}=\w{1,}&){1,}\w{1,}=\w{1,}/; // var re2 = "(\\w{1,}=\\w{1,}&){1,}\\w{1,}=\\w{1,}" var result= text.split(re); alert(result); alert(result[0]+",0"); alert(result[1]+",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)
- 常用字符串正则
-
- 正则 含义 补充
- ^[A-Za-z]+$ 匹配由26个英文字母组成的字符串 或 /^[a-z]+$/i
- ^[A-Z]+$ 匹配由26个英文字母的大写组成的字符串
- ^[a-z]+$ 匹配由26个英文字母的小写组成的字符串
- ^[A-Za-z0-9]+$ 匹配由数字和26个英文字母组成的字符串 注意\w包含下划线_
- ^\w+$ 匹配由数字、26个英文字母或者下划线组成的字符串
- 常用数字正则和常用字符串正则,是最基本的正则应用,读者可以作为入门的练习,试试能不能快速的读懂其中的含义。
- 匹配中文字符
-
- 普遍使用的正则是[\u4e00-\u9fa5],但这个范围并不完整。例如:
- /[\u4e00-\u9fa5]/.test( '?' )
- 根据Unicode 5.0版编码,要准确的判断一个中文字符要包括:
- 范围 含义 范围 含义
- 2E80-2EFF CJK 部首补充 2F00-2FDF 康熙字典部首
- 3000-303F CJK 符号和标点 31C0-31EF CJK 笔画
- 3200-32FF 封闭式 CJK 文字和月份 3300-33FF CJK 兼容
- 3400-4DBF CJK 统一表意符号扩展 A 4DC0-4DFF 易经六十四卦符号
- 4E00-9FBF CJK 统一表意符号 F900-FAFF CJK 兼容象形文字
- FE30-FE4F CJK 兼容形式 FF00-FFEF 全角ASCII、全角标点
- 因此,正确的匹配中文字符正则表达式为:
- var rcjk = /[\u2E80-\u2EFF\u2F00-\u2FDF\u3000-\u303F\u31C0-\u31EF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FBF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF]+/g;
- 如果不希望匹配标点、符号,在正则中去掉对应的范围即可:
- 3000-303F CJK 符号和标点 FF00-FFEF 全角ASCII、全角标点
- 匹配双字节字符(包括汉字在内)
-
- [^\x00-\xff],可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1),代码示例如下:
- console.info( "abc".replace( /[^\x00-\xff]/g,"aa" ).length )
- console.info( "汉字".replace( /[^\x00-\xff]/g,"aa" ).length )
- console.info( "abc汉字".replace( /[^\x00-\xff]/g,"aa").length )
- 匹配HTML标记的正则表达式
-
- 先说说网上流传的版本:
- <(\S*?)[^>]*>.*?</\1>|<.*? />
- *? *表示0个或多个,?表示0个或1个,两个叠加起来标识0个多个,与*的功能重叠
- (\S*?) 标签的长度必须大于0,因此不能用*?
- |<.*?\/> 没有分组,无法获取以<div/>这种自关闭格式书写的标签
- </\1>
- <.*? /> 有的标签是不关闭的,比如<br><hr>,因此不能强制关闭
- 修正如下:
- var rtag = /^<([a-z]+)\s*\/?>.*(?:<\/\1>)?$/i
- rtag.exec( '<-div></-div>')
- rtag.exec( '<div>abc')
- 这个表达式也不完善,比如第二条测试语句,这么写是为了能提取中包含了文本内容的标签,如果要严格匹配,可再次修改为:
- var rtag = /^<([a-z]+)\s*\/?> (?:<\/\1>)?$/i
- 这个正则的应用范围仅限于简单的标签匹配、提取,不能匹配嵌套标记。
- 匹配首尾空白字符的正则表达式
-
- 先说说网上流传的版本:
- ^\s*|\s*$
- 可以删除行首行尾的空白字符,例如:
- ' \t \n\r abc \t \n\r '.replace( /^\s*|\s*$/g, '' )
- 但是用\s*不能判断出字符串是否在开头或结尾处有\s,例如:
- /^\s*|\s*$/.test( 'abc' )
- 修正如下:
- ^\s+|\s+$
- ' \t \n\r abc \t \n\r '.replace( /^\s+|\s+$/g, '' )
- /^\s+|\s+$/.test( 'abc' )
- 匹配Email地址的正则表达式
-
- 先介绍下Email的规则:local-part@domain
- local-part最长64,domain最长253,总长最长256
- local-part可以使用任意ASCII字符:
- 大小写英文字母 a-z,A-Z
- 数字 0-9
- 字符 !#$%&'*+-/=?^_`{|}~
- 字符 .不能是第一个和最后一个,不能连续出现两次
- 但是有些邮件服务器会拒绝包含有特殊字符的邮件地址
- domain(域名)仅限于26个英文字母、10个数字、连词号-
- 连词号-不能是第一个字符
- 顶级域名(com、cn等)长度为2到6个
- 先说说网上流传的版本:
- \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
- () 莫名奇妙的分组,如果只分组不记录,可以使用(?:)
- @\w domain不能包含下划线_
- \w+([-.]\w+)* 顶级域名不符合规则
- 修正如下:
- var remail = /^([\w-_]+(?:\.[\w-_]+)*)@((?:[a-z0-9]+(?:-[a-zA-Z0-9]+)*)+\.[a-z]{2,6})$/i
- remail.exec( 'nuysoft@gmail.com' )
- remail.exec( 'nuysoft@gmail.comcomcom' )
- remail.exec( 'nuysoft@_gmail.com )
- 修正后的正则有如下局限性:
- 不支持中文邮箱、中文域名,之所以不在其中支持是因为我个人的爱好倾向,反感这类华而不实的玩意
- 不支持特殊符号,避免非邮件服务器拒绝,如果需要,可以添加。
- 参考文章:
- http:
- http:
- 匹配网址URL的正则表达式
-
- 先说说网上流传的版本:
- [a-zA-z]+:
- 粗糙,没有对URL中各个块进行分组
- 修正如下(又一段网上流传的版本):
- var _url = "^((https|http|ftp|rtsp|mms)?://)?" //
- + "(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?"
- + "(([0-9]{1,3}.){3}[0-9]{1,3}"
- + "|"
- + "([0-9a-z_!~*'()-]+.)*"
- + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]."
- + "[a-z]{2,6})"
- + "(:[0-9]{1,4})?"
- + "((/?)|"
- + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
- var rurl = new RegExp( _url, 'i' );
-
- 测试:
- rurl.exec( 'baidu.com' )
- rurl.exec( 'http://baidu.com' ) //
- rurl.exec( 'http://www.baidu.com' ) // ["http://baidu.com", "http://", "http", undefined, undefined, "baidu.com", undefined, "baid", undefined, undefined, "", "", undefined]
- rurl.test( 'baidu' )
- 看来不怎么也好用,有待学习TODO。
- 匹配账号是否合法
-
- 先说说网上流传的版本:
- ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- (字母开头,允许5-16字节,允许字母数字下划线)
- 限制必须以字母开头现在看来不合适,比如QQ登录平台
- 限制不能以下划线开头也没有必要,比如百度就允许,因此简单点
- 修正如下:
- var ruser = /\w{4,16}/
- 匹配国内电话号码
-
- 网上流传的版本很好用:
- \d{3}-\d{8}|\d{4}-\d{7}
- 评注:匹配形式如 0511-4405222 或 021-87888822
- 匹配腾讯QQ号
-
- 网上流传的版本很好用:
- [1-9][0-9]{4,}
- 评注:腾讯QQ号从10000开始
- 匹配中国邮政编码
-
- 网上流传的版本很好用:
- [1-9]\d{5}(?!\d)
- 评注:中国邮政编码为6位数字
- 匹配身份证
-
- 先说说网上流传的版本:
- \d{15}|\d{18}
- d{15}
- \d{18} 可以判断,但是有些粗糙
- 从身份证可以解析出地址、生日、性别等,因此特别说明一下:
- 身份证规则
- 中国的身份证为15位(一代)或18位(二代),区别在于二代证只是在一代证的第七位数字前加了19和在末尾加了一位验证码
- 将15位升级为18位,并解析18位号码构成(地址、生日、性别)
- 代码如下:
- function parseID(ID) {
- if ( ID.length == 15 ) {
-
- ID = ID.substr( 0, 6 ) + "19" + ID.substr( 6 );
-
- var rank = [
- "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"
- ];
-
- var last = [
- "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
- ];
-
- for ( var i = 0, sum = 0, len = ID.length; i < len; i++)
- sum += ID[ i ] * rank[ i ];
-
- ID += last[ sum % 11 ];
- }
- if ( ID.length != 18 ) return null;
-
- var match = rid.exec( ID );
- return match ? {
- ID : ID,
- area : match[ 1 ],
- y : match[ 2 ],
- m : match[ 3 ],
- d : match[ 4 ],
- sex : match[ 5 ] % 2
- } : null;
- }
- 限制:
- 这里只是解析出了地址代码,如何将代码转换为实际地址请问度娘。
- 返回对象中的sex为1(男)或0(女),并未做转换,如果页面显示需要,可以这样转换:sex ? "男" : "女"
- 测试:
- console.info( parseID( "142327840821047" ) );
- console.info( parseID("142327198408210470" ) );
- 参考资料:
- http:
- 匹配IP地址
-
- 先说说网上流传的版本:
- \d+\.\d+\.\d+\.\d+
- \d 数字没有限制
- 修正如下:
- var rip = /^(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])$/;
- rip.test( "192.168.1.1" )
- rip.test( "0.0.0.0" )
- rip.test( "255.255.255.255" )
- rip.test( "256.255.255.255" )
- 进一步增加分组:
- var rip2 = /^([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])$/;
- rip2.exec( "192.168.1.1" )
- rip2.exec( "0.0.0.0" )
- rip2.exec( "255.255.255.255" )
- rip2.exec( "256.255.255.255" )
|