您的位置:首页 > Web前端 > JavaScript

javascript正则表达式从0开始学习

2014-04-18 18:29 260 查看
正则表达式在js中主要是对字符串进行匹配,常用在输入验证方面,如邮箱,手机号等。比起循环的判断字符串中的每一个字符,正则表达式往往更能节省性能,并起到事半功倍的效果。以下开始js正则的学习之路。

书写方式:

1.字面量表示:  

/ab/i        ---由两个/组成    

/pattern/attributes


2.RegExp构造函数:  

var reg  =new RegExp(“ab“,”i“);              ----同1的效果

new RegExp(pattern, attributes);


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

修饰符:

对于上面的两种定义方式,其中字符i即为修饰符的一种,js正则修饰符共有三种

i         忽略大小写
g  执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
第三种就是m,表示执行多行匹配,没有大的用处。

i:  

        例如测试字符串“Abc”中是否含有“ab”


        不加i  ----------   document.write("/ab/".test("Abc")) ;           //false; 

        加i     -----------  document.write("/ab/i".test("Abc")) ;           /true/;  加上i后输出就为true了,即忽略了“ab”的大写方式。

g:

        例如将字符串”a b c“中的空格替换为$符


        不加g ----------  document.write("a b c".replace(/\s/,"$"));   //a$b c       其中\s代表空格,结果是只替换了第一个就停止了

        加g    -----------  document.write("a b c".replace(/\s/g,"$"));   //a$b$c     加上g后的效果是将字符串”a b  c“中的所有空格都替换了,(注意replace里的正则并没有加引号)。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

RegExp 对象方法:

方法的参数为String,调用者为RegExp(因为方法是属于RegExp对象的,所以RegExp为调用者)

1.  exec(string):

检索字符串中正则匹配的值。

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

例如: /ab/.exec("1a2d")     // null 

2.  test(string):

检索字符串中是否包含正则匹配的值。

返回 true 或 false。

例如: /ab/.test("1abd")     // true  测试字符创“1abd”中是否包含字符串“ab”

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

String对象的与正则相关的方法:

方法的参数为RegExp,调用者为String(因为方法是属于String对象的,所以String为调用者)

1. search(RegExp):

检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

返回第一个字符的位置,没有找到则返回-1

例如

       "abcdefgbc12".search(/bc/)       // 1    从字符创“abcdefg” 中检索“bc”,找到”bc“出现的第一个位置是1(注意,search只要找到第一个就会返回,而不管有几处都能匹配)

       "abcdefgbc12".search(/bc34/)       //-1    从字符创“abcdefg” 中检索“bc12”,没有找到“bc12”,所以返回-1

2. match(RegExp):

在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。http://write.blog.csdn.net/postedit/21075889

返回匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

例如

       "abcdefgbc12".match(/bc/)     // [bc]           返回匹配“bc”返回的数组,因为RegExp没有g标志,所以返回bc

      "abcdefgbc12".match(/bc/g)     // [bc,bc]    返回匹配“bc”返回的数组,因为RegExp有g标志,所以返回所有的匹配

      "abcdefgbc12".match(/bc5/)     //null          没有匹配到bc5,返回null

3.  replace(RegExp):

用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

返回经过替换后的新字符串

例如:

      "123@456@7".replace(/@/g,"!")     // 123!456!7    将"123@456@7"中的所有“@”字符替换为 “!”

       "123@456@7".replace(/!/g,"@")     // 123!456!7     将"123@456@7"中的所有“!”字符替换为 “@”,因为没有找到@,所以返回原字符串

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正则的量词匹配

^n   :匹配任何以n开头的字符串。

  /^b/.test("bac")     [b]//true[/b]

n+   :匹配任何包含至少一个 n 的字符串。

/b+/.test("abbc")
//true

[b]n*   :[/b]匹配任何包含零个或多个
n 的字符串

  /ab*/.test("aac") //true
[b][b]/ab*/.test("[b]cbbbac") //true[/b][/b]
[/b]

[b][b]n?   :[/b]匹配任何包含零个或一个 n 的字符串[/b]

  /ab?c/.test("ac") //true [b]
因为a后面的b
[/b]为0个

/ab?c/.test("abbc")   //false 因为a后面的b超过了一个所以为false,如果将?换成*或+,则结果为true

[b][b]n$   :匹配任何结尾为 n 的字符串。[/b][/b]

[b][b]/ab$/.test("eeeeeab") //true
[/b][/b]

[b][b][b]/ab$/.test("eeeeeabc")[/b][/b][/b]//false,因为ab并不是结尾[b][/b]

[b][b]n{x}   :匹配包含 X 个 n 的序列的字符串。[/b][/b]

[b]  /ab{4}/.test("eeeeeabbbba")  [b][b][b]//true
[/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b]/ab{4}/.test("ab[b]bbbb") [b][b]//true[b]为什么该字符串里有5个b,执行结果也是true,是因为只要包含x个b即可,即使后面还有b[/b][/b][/b][/b][/b][/b][/b][/b]
[/b][/b][/b][/b][/b]

[b][b][b][b]n{x,}   :匹配至少包含 X 个 n 的序列的字符串。[/b][/b][/b][/b]

[b]  [b][b]/ab{4}/.test("ab[b]bbbb") [b][b]//true[/b][/b][/b][/b]
[/b][/b]

[b][b][b][b]n{x,y}   :匹配至少包含 X 个 n 或y个n的字符串。[/b][/b][/b][/b]

[b]  [b][b]/ab{2[b],4}/.test("abbc") [b][b]//true[/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b]/ab{4,2}/.test("abbc")[/b]
//
[/b][/b][/b][/b][/b][/b][/b]SyntaxError: Invalid regular expression: /ab{4,2}/: numbers out of order in {} quantifier.

                                                          [b][b][b][b][b][b][b]//[/b][/b][/b][/b][/b][/b][/b]这是实际测试结果,说明x必须大于或等于y,而不能小于y

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正则的范围匹配

范围匹配主要是采用[ ],如下

[b][b][b][b][ abcd ]   :查找方括号之间的任何字符。[/b][/b][/b][/b]

   /[ab]/.test("12b")    [b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b]

  [b][b][b][b][b][/b][/b][/b][/b][/b]/[ab]/.test("12a")   [b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b] 

  /[ab]/.test("12a34b")   [b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b]

[b][b][b][b][^abcd ]   :查找任何不在方括号之间的任何字符。[/b][/b][/b][/b]

[b][b][b]  [/b][/b][/b]/[^ab]/.test("ab") [b][b][b][b][b][b]//fasle[/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b]/[^ab]/.test("acb") [b][b][b][b][b][b][b]//true
因为c不[b]既不是a,也不是b
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][a-f]   :中间加上-   则代表范围,该表达式为a到f。[/b][/b][/b][/b]

[b][b][b]  [/b][/b][/b]/[a-f]/.test("Dghi") [b][b][b][b][b][b]//fasle
D不在该范围,如果改成[b][b]
[/b]/[a-f]/i.test("Dghi"),即不区分大小写,则结果为true[/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b]/[a-f]/.test("eghi") [b][b][b][b][b][b][b]//[b]true[/b][/b][/b][/b][/b][/b][/b]
因为e在a到f的范围内[/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b]常用的有:[/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b]/[a-z]/
小写a到小写z[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]单一字符
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b],[b][b][b][b][b][b][b]/[A-Z]/
大写A到大写Z[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]单一字符
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b],[b][b][b][b][b][b][b]/[0-9]/
0到9[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]单一字符
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b],
[a-zA-Z] 大小写单一字符

 大写字母的顺序是在小写字母前面的,所以[A-g]是正确的,[a-G]则会报错

[b][b][b][b]|  :单竖线代表或者, 匹配的要么是该符号左边的子表达式,要么它右边的子表达式,即|的左边和右边分别是一个整体。[/b][/b][/b][/b]

   /ab|cd/.test("1ab23")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

   /ab|cd/.test("ac")      
[b][b][b][b][b][b][b][b][b][b][b][b][b][b]//false[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b]( ):小括号代表子匹配[/b][/b][/b][/b]

   /(ab)/.test("1ab23")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

 
[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]/(ab)ef/.test("1ab23")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//false[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正则的元字符匹配

[b][b][b][b]. :代表任意字符[/b][/b][/b][/b]

   /./.test("%")  
[b][b][b][b][b][b][b][b][b][b][b][b][b][b]//true[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b],如果需要匹配单个.怎么办,需要用到下方的转义字符

[b][b][b][b]\ :转义字符,对一些有特殊意义的字符转义,使能匹配到特殊字符,[/b][/b][/b][/b]
[b][b][b][b]  [/b][/b][/b][/b]/\./.test("%")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//[b]false因为%不是.,此处的.已经被转义,不是任意字符[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]/\./.test("[b].abc")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//true [/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b]\s :小s代表空格[/b][/b][/b][/b]

[b][b][b][b] 
/[b]ab\s2
/.test("1ab 2")  [b][b][b][b][b][b][b][b][b][b][b][b][b][b]//[b]true[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b]
[/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b]\S :大S代表非空格[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]/[b]ab\S2/.test("1ab
2
")  
[b][b][b][b][b][b][b][b][b][b][b][b][b][b]//[b]false[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b]\d :匹配数字[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b]\d :匹配非数字[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b]\w :匹配单词字符(下划线,数字或字母)[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b]\W :匹配非单词字符[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

常用的一些字符做一下解析

验证手机号(国内的):


  /^[1][3|5][0-9]{9}$/[b] 以1开头,并且之后紧接着3或者5,然后是9个0到9的数字
[/b]

验证输入是否只有数字,字母或下划线组成:
   

/^
[0-9a-zA-Z\_]+$
/[b] 
[/b]

验证邮箱:


  目前网上给的各种验证邮箱的例子不一致,所以在此只做个思路的分析,之后发现更好地再贴上,


  邮箱的格式应该是    多个字符(数字或_)
  @   
多个字符(数字或_)
.
多个字符结尾


    所以先简单按字面意思写一个   
/^
[0-9a-zA-Z\_]+@[b][0-9a-zA-Z\_]+
\.[b]
[b][a-zA-Z]+
[/code]
[/b][/b]$
/

[/b]

[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息