正则表达式的定义
正则表达式直接量定义为包含在一对斜杠(/)之间的字符
ES5对同一段代码所表示的正则表达式直接量的每次运算都返回新对象
在使用 *,?时要注意,由于这些字符可能匹配0给字符,因此它们允许声明都不匹配。/a*/实际上与字符串"bbbb"匹配
由于正则表达式的模式匹配棕色寻找字符串中第一个可能匹配的位置。由于该匹配是从字符串的第一个字符开始,因此在这里不考虑他的字符串中更短的匹配
选择项的尝试匹配次序是从左到右,直到发现了匹配想。如果左边的选择项匹配,久忽略右边的匹配项,即使它产生更好的匹配
正则表达式圆括号的作用:
把单独的项组合成子表达式
在完整的模式中定义子模式
允许统一正则表达式的后部引用前面的自表达式(通过在字符“、”后加一位或多位数字来实现)
所谓对正则表达式中前一个子表达式的引用,并不是指对子表达模式的引用,而是指与那个模式项匹配的文本的引用
正则表达式不允许单引号里面嵌套双引号,反之亦然。所以不要在字符类中使用这种引用
(?:)只是组合,把项组合到一个单元,但不记忆与该组相匹配的字符
有些元素被称作正则表达式的锚,因为它们将模式定位在搜索字符串的特定位置上
如果在符号"(?= )"之间加一个表达式,它就是一个先行断言,用以说明圆括号内的表达式必须正确匹配。
带有“(?!”的断言是负向先行断言,用以指定接下来的字符都不匹配
JavaScript支持三个修饰符,修饰符“i”用以说明模式匹配是不区分大小写的。修饰符“g”说明匹配应该是全局的。而修饰符“m”用以在多行模式中执行匹配
用于模式匹配的String方法
String支持4种使用正则表达式的方法,最简单的是search(),它返回第一个与之匹配的字符串的初始位置
search()方法不支持全局检索,因为它忽略正则表达式中的修饰符
replace()方法用以执行检索与替换操作。其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。
如果在替换字符串中出现$加数字,那么replace()将用与指定的自表达式项匹配的文本来替换这两个字符
replace()方法的第二个参数可以是函数,该函数能够动态地计算替换字符串
match()方法是最常用的String正则表达式,它唯一的参数就是一个正则表达式。如果该正则表达式设置了修饰符g,则该方法返回的数组包含了字符串的所有匹配结果。
即使match()执行的不是全局检索,也会返回一个数组,这种情况下,返回的第一个元素是匹配的字符串,余下的元素则是正则表达式中用圆括号扩起来的子表达式
String对象的最好一个和正则表达式有关的方法是split(),只有一个参数
RegExp对象
不论是字符串直接量还是正则表达式,都是用“\”作为转义字符的前缀,因此当给RegExp()传入的字符串表述的正则表达式,必须将“\”替换为"\\"。RegExp()的第二个参数是可选的,他就指定正则表达式的修饰符。不过只能传入修饰符g、i、m或者它们的组合
var zipcode = new RegExp("\\d{5}","g")
属性index包含了发生匹配的字符位置,属性input引用的是正则检索的字符串
如果exec()没有发现任何匹配结果,它会将lastIndex属性设置为0(任何时候都可以将lastIndex设置为0,每当在字符串中查找最后一个匹配项后,在使用这个RegExp对象开始新的字符串查找之前,都应将lastIndex设置为0)。这种特殊的行为使我们可以在用正则表达式匹配字符串的过程中反复调用exec()
如果找到,返回一个数组,类似于非全局状态的match,否则返回null
与exec()和test()不同,String方法search()、replace()和match()并不会用到lastIndex。String方法只是简单的酱lastIndex设置为0。
如果让一个带有修饰符g的正则表达式对多个字符串执行exec()或test(),要么在每个字符串中找出所有的匹配一遍将lastIndex自动重置为0,要么显式酱lastIndex手动设置为0(当最后一次检索失败需要手动设置lastIndex)