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

正则表达式在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")     //true

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

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

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

  /ab*/.test("aac") //true

/ab*/.test("cbbbac") //true

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

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

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

n$   :匹配任何结尾为 n 的字符串。

/ab$/.test("eeeeeab") //true

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

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

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

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

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

  /ab{4}/.test("abbbbb") //true

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

  /ab{2,4}/.test("abbc") //true

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

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

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

正则的范围匹配

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

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

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

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

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

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

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

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

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

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

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

常用的有:

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

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

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

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

   /ab|cd/.test("ac")       //false

( ):小括号代表子匹配

   /(ab)/.test("1ab23")  //true

  /(ab)ef/.test("1ab23")  //false

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

正则的元字符匹配

. :代表任意字符

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

\ :转义字符,对一些有特殊意义的字符转义,使能匹配到特殊字符,

  /\./.test("%")  //false因为%不是.,此处的.已经被转义,不是任意字符

/\./.test(".abc")  //true 

\s :小s代表空格

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

\S :大S代表非空格

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

\d :匹配数字

\d :匹配非数字

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

\W :匹配非单词字符


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

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

验证手机号(国内的):

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

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

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

验证邮箱:

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

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值