犀牛书笔记:(13)Pattern Matching with Regular Expressions
JS类RegExp用来表示正则表达式
?
JS中正则表达式是用两个//括起来的,如
var pattern = /s$/; 等同于 var pattern = new RegExp("s$");
?
?
字母数字 ? ? ? ? 本身\0 ? ? ? ? ? ? ? ? ?NUL\t ? ? ? ? ? ? ? ? ? Tab\n ? ? ? ? ? ? ? ? ?新的一行\v ? ? ? ? ? ? ? ? ?vertical tab\f ? ? ? ? ? ? ? ? ? Form feed\r ? ? ? ? ? ? ? ? ? carriage return\xnn ? ? ? ? ? ? ? the latin character specified by the hexadecimal number nn;\uxxxx ? ? ? ? ? ?the unicode character specified by the hexadecimal number xxxx;\cX ? ??这些标点在正则中有特殊的意思:^ $ . * + ? = ! : | \ / ( ) [ ] { }因此如果要把它们作为标点字符,需要加\,如果记不住哪些标点需要逃逸符,可以简单的在所有符号前加上逃逸符。另一方面,某些数字和字母在逃逸符前置的情况下有特殊的意义,如果仅仅只是想把逃逸符作为标点符号,也需要在前面再加一个逃逸符。Character Classes
将字符放入到[]中,就构成了一个Character Classes,Character Classes和任何包含了[]中字符的内容匹配。
比如[abc]将匹配含有a,b或者c的内容。
?
相反,negated character class使用^,[^abc]将和任何不含有a,b或c的内容匹配。
?
可以使用-来表示一段范围,比如[a-z],[0-9]
?
?
[...] ? ? ? Any one character between the brackets[^...] ? ?Any one character not between the brackets.. ? ? ? ? ? Any character except newline or another Unicode line terminator\w ? ? ? ?Any ASCII word character. Equivalent to [a-zA-Z0-9]\W ? ? ? Any character that is not an ASCII word character. Equivalent to [^a-zA-Z0-9]\s ? ? ? ?Any unicode whitespace character.\S ? ? ? ?Any character that is not Unicode whitespace.\d ? ? ? ?Any ASCII digit. Equivalent to [0-9]\D ? ? ? ?Any character other than an ASCII digit. Equivalent to [^0-9][\b] ? ? ?A literal backspace重复
?
{n,m} ? ? 匹配{}之前的字符,最少出现N次,最多出现M次{n,} ? ? ? 匹配之前的字符,最少出现n次{n} ? ? ? ?精确出现n次? ? ? ? ? ? 0或一次出现,等同于{0,1}+ ? ? ? ? ? ?1或多次出现,等同于{1,}* ? ? ? ? ? ?0或多次出现,等同于{0,}以上的模式,称为贪婪重复,它将会尽可能多的匹配
如果在他们后面加上问号,比如??,+? *?就称为非贪婪匹配,它将会尽可能少的匹配,
比如,/a+/和/a+?/匹配"aaa",前者会匹配3次,而后者只匹配第一个a
?
非贪婪重复可能引起错误,比如/a*b/和/a*?b/匹配"aaab"的结果都是aaab
这是因为在正则配对中,一旦有一个字符串满足配对规则,就配对成功。也就是说,如果整个字符串满足条件,它的子字符串将不做考虑。
?
|表示可选的,or的逻辑,比如/ab|cd|ef/匹配字符串ab或cd或ef。
注意,用|连接的选项是从左到右进行分析的,一旦左边的条件已经满足,右边的就被忽略,即使右边的会提供一个“更好”的匹配。比如/a|ab/对于“ab",只会匹配到a
?
?
括号在正则中有多种作用:
?
?
^ ? ? 匹配字符串的开头和行的开头$ ? ? ?匹配字符串结尾和行尾\b ? ?匹配一个单词边界。(注意不在character classes)\B ? ?和非单词边界匹配(?=p) ? 断言(?!p) ?断言/\bJava\b/,匹配单个单词为java的。JS1.2支持两种标志位:
i,表示模式匹配是大小写不敏感的
g,表示模式匹配是全局的,也就是说被搜索字符串的所有匹配都会被找到。
这两个标志位是在//之外的,如:
/\bjava\b/i
?
JS 1.5支持另一个标志位m,
在m模式下,如果一个被搜索字符串包含多行,^$锚点就会匹配行的开头和结尾
?
?
字符串支持4种正则操作。
?
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;var text = "Visit my blog at http://www.example.com/~david";var result = text.match(url);if( result != null) { var fullurl = result[0]; // http://www.example.com/~david var protocol = result[1];//http var host = result[2];//www.example.com var path = result[3]; //~david}对于非g搜索,match还返回index属性,表明匹配的起始位置。input属性,是目标字符串的拷贝。split()。
?
RegExp对象
构造方法有一到两个参数,第一个是正则表达式,该表达式不用像前面那样用//包围。第二个是i,g,m标志位
RegExp对象的意义在于,由于其参数是字符串,因此可以动态的创建正则表达式
?
RegExp定义了两个方法,
?
?
?