博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript正则表达式入门笔记(完整版)
阅读量:5824 次
发布时间:2019-06-18

本文共 2951 字,大约阅读时间需要 9 分钟。

两种定义正则表达式对象(RegExp)的方法:

1) var pattern = /s$/;
2) var pattern = new RegExp("s$");

系统学习正则表达式的两本参考:

1)Programming Perl by Larry Wall et al. (O'Reilly).
2)Mastering Regular Expressions by Jeffrey E.F. Friedl (O'Reilly)

转义字符(backslash):\

字母和数字不需要转义。其他字符如果记不住就用吧。
这些字符有特殊含义,需要转义:^ $ . * + ? = ! : | \ / ( ) [ ] { }
其它特殊字符表示方法:
\0 NULL(unicode十六进制表示法为\u0000,下同)
\t Tab (\u0009)
\n NewLine (\u000A)
\v Vertical tab (\u000B)
\f Form feed (\u000C)
\r Carriage return (\u000D)
\xnn The Latin character specified by the hexadecimal number nn; for example, \x0A is the same as \n
\uxxxx The Unicode character specified by the hexadecimal number xxxx; for example, \u0009 is the same as \t
\cX The control character ^X; for example, \cJ is equivalent to the newline character \n

一类字符的表示方法:

[...] 括号内的任意一个字符
[^...] 除括号内字符之外的任意一个字符
. 除换行符(or another Unicode line terminator)外的任意一个字符
\w 字母、数字或下划线,等价于[a-zA-Z0-9_]
\W 除字母、数字或下划线外的任意一个字符,等价于[^a-zA-Z0-9_].
\s Unicode whitespace
\S 除Unicode whitespace之外的其他字符。须注意\w和\S是不一样的。
\d 数字,等价于[0-9]
\D 非数字,等价于[^0-9].
[\b] backspace (方括号之间的\b指的是键盘上Backspace键对应的字符).
\b   \w和\W之间的位置(锚点),请注意第二个W是大写字母。

重复匹配模式:

{n,m} 匹配至少n次,但是不超过m次
{n,}    匹配n次或n次以上
{n} 匹配恰好n次
? 匹配0次或1次,等价于{0,1}
+ 匹配1次或1次以上,等价于{1,}
* 匹配0次或0次以上,等价于{0,}
 
举例:
/\d{2,4}/     2-4个数字
/\w{3}\d?/    1-3位是个字母、数字或下划线,第四位是一个可选的数字
/\s+java\s+/  匹配"java"单词,前后都要有空格,1个或多个空格都行
/[^"]*/       不含双引号的字符串

提醒:使用*和?时要小心。例如/a*/不要求a必须出现,所以"bbb"也会被匹配的。

贪心匹配和不贪心匹配:
之前提到的重复匹配模式会匹配尽可能多的字符,用贪心一词形容很贴切。在重复模式后面跟个问号,则匹配尽可能少的字符。
例如,"aaabbbb"匹配/a*b*/的结果是aaabbbb,匹配/a*b*?/的结果是aaa,匹配/a*?b*/的结果是什么都没有。跟你想的一样么?

选择(alternation)、分组(grouping)和引用(references)

|这个符号从左向右选择第一个可以匹配的模式,例如"aaabbb"匹配/a*|a*b*|b*/的结果是aaa。
()可以构造表达式与|,*,+,?等组合使用。例如/java(script)?/可以匹配"java"或"javascript"(优先)。
()还可以帮助抽取子模式。例如/[a-z]+\d+/可以匹配字母加数字,但是如果你真正关心的是匹配成功后的数字部分,那么,/[a-z]+(\d+)/可以帮到你。
\加一个数字可以引用前面的表达式,无论是否嵌套,总是数左括号的位置。例如/['"][^'"]*['"]/的本意是匹配一对双引号或一对单引号界定的字符串,这个公式还不够严谨。正确的写法是/['"][^'"]*\1/
(?:开头意味着不让引用,例如/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/这个模式如果有\2,那么引用的就是(fun\w*)了。

提醒:引用提取的是匹配结果(字符串)而不是公式。

锚点(位置匹配):
锚点本质上是对匹配条件的强化。
最基本的锚点就是^和$,表示字符串的开始位置和结束位置。
例如,\s可以表示空格,用它提取单词/\sJava\s/,会连着空格一起提取出来" Java ",如果不需要空格则可以用/\bJava\b/,提取出来的就是"Java"。
\b就是边界的意思。\B表示无边界。例如/\Bscript\b/可以匹配"javascript"提取"script",/\bscript\b/不能,它返回null。
(?=和(?!分别规定字符串为边界。例如/Java(?!Script)/可以匹配"Java is powerful",不能匹配"JavaScript is powerful"。

标记(Flags):

在正则表达式结尾处。i表示不区分大小写。(已验证)
g表示找到全部匹配结果。(有待验证)
m表示多行匹配。(有待验证)

 
  1. var mystr = "aaAabbbbbabb";  
  2. var ptn = /a+/ig;  
  3. iJs.pt("mystr");  
  4. iJs.pt("ptn");  
  5. iJs.pt("ptn.exec(mystr)");  
  6. iJs.pt("ptn.test(mystr)");  
  7. iJs.pt("ptn.global");//g标志true or false  
  8. iJs.pt("ptn.ignoreCase");//i标志true or false  
  9. iJs.pt("ptn.multiline");//m标志true or false  
  10. iJs.pt("ptn.lastIndex");//上次匹配结束的位置,初始值为0  
  11. iJs.pt("ptn.source");//正则表达式公式  
  12. iJs.pt("mystr.match(ptn)");//g参数发挥作用的条件比较微妙 
调试信息:
    mystr   
aaAabbbbbabb
    ptn   
/a+/ig
    ptn.exec(mystr)   
aaAa
    ptn.test(mystr)   
true
    ptn.global   
true
    ptn.ignoreCase   
true
    ptn.multiline   
false
    ptn.lastIndex   
10
    ptn.source   
a+
    mystr.match(ptn)   
aaAa,a
 

转载地址:http://wiidx.baihongyu.com/

你可能感兴趣的文章
晚婚晚育 近20年巴西35岁以上孕妇增加65%
查看>>
区块链通证发行后创始公司存活率只有44%,推特活跃度与存亡相关
查看>>
看看一个吃货是怎样在老家过年的,这样子父母才高兴
查看>>
张艺兴代言爱奇艺VIP会员 “快乐要尽兴”追剧没时差
查看>>
读书:为了那个美妙的咔哒声
查看>>
我从过去八个月的AI公司面试中学到了什么?
查看>>
jQuery实践小结
查看>>
深入探究Immutable.js的实现机制(一)
查看>>
jsp改造之sitemesh注意事项
查看>>
由浅入深Java内存模型
查看>>
从零开始:TensorFlow机器学习模型快速部署指南
查看>>
iOS底层原理总结 - 探寻block的本质(二)
查看>>
如何用GO语言编写缓存服务?
查看>>
【专访】黄健宏:为什么真正的聪明人喜欢用笨方法?
查看>>
美食图谱复现指南之依存句法分析
查看>>
我用这种方法在 Spring 中实现消息的发送和消费
查看>>
Preact -- React的轻量解决方案
查看>>
ES6 模块原生支持在浏览器中落地,是时候该重新考虑打包了吗?
查看>>
使用腾讯云“自定义监控”监控GPU使用率
查看>>
Android开源的精美日历控件,热插拔设计的万能自定义UI
查看>>