JavaScript语言精粹——正则

来源:互联网 发布:美妆凯文老师的淘宝店 编辑:程序博客网 时间:2024/06/05 22:49
正则表达式是一门简单语言的语法规范。。它以方法的形式被用于对字符串进行查找、替换和提取操作。可处理正则表达式的方法有regexp.exec、regexp.test、string.match、string.replace、string.search、string.split.在JavaScript中正则表达式相较于等效的字符串运算有显著的性能优势。

正则表达式的书写很复杂,它们把某些位置的字符串解析为运算符,而把位置稍微不同的相同字符串当作字面量,如果想正确理解,就必须对正则表达式有彻底了解。

JavaScript的正则表达式难以分段阅读,因为它们不支持注释和空白。JavaScript程序中正则表达式必须写在一行中。
1.例子
var parse_url=/^(?:(A-Za-z+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#*))?(?:\?([^#]*))?(?:#(.*))?$/;
①^字符表示字符串的开始,它是一个标记,用来防止exec跳过不像URL的前缀
②(?:([A-Za-z]+):)?这个因子匹配一个协议名,但仅当它之后跟随一个:的时候才匹配。(?: ...)表示一个非捕获型分组,后缀?表示这个分组是可选的。
③(...)表示一个捕获型分组,一个捕获型分组将复制它匹配的文本并将其放入result数组。
④[...]表示一个字符类,[A-Za-z]包含26个大写和小写字母,连字符表示从A到Z,后缀+表示这个字符类将被匹配一到多次。
⑤(\/{0,3})中,\/表示一个应该被匹配的/,用\转义。{0,3}表示/将被匹配0次或者1~3次之间。
⑥(?::(\d+))?将匹配一个主机名,由一或多个数字、字母或者点或者-组成,-将被转义为\-防止与表示范围的连字符混淆。
⑦点  . 将匹配除行结束符之外所有字符。
⑧$表示字符串的结束。

var parse_number=/^-?\d+(?:\.\d*)?(?:e[+\-]?\d)?$/i;
①^和$导致文本中的所有字符都要针对这个正则表达式进行匹配,如果仅包含^,将匹配以一个数字开头的字符串,仅包含$将会匹配以一个数字结尾的字符串。
②i标识规定当匹配字母时忽略大小写,匹配数字时候可以匹配e/E;
③-?,减号后边的?后缀表示这个减号是可选的。
④/d的含义与[0-9]一样,匹配一个数字,后缀+规定它可以匹配一个或多个数字。
⑤(?:...)表示一个可选的非捕获型分组。
⑥(?:e[+\-]?\d+)?是另外一个可选的非捕获型分组,将匹配一个e或E、一个可选的正负号或者一到多个数字。

2.结构
有两种方式创建一个RegExp对象,优先使用正则表达式字面量。正则表达式字面量被包围在一对斜杠中。
①正则表达式标志:
<1>  G:全局匹配,匹配多次,准确含义随方法而变
<2>  I:大小写不敏感
<3>M:多行模式
    //1.正则表达式字面量匹配JavaScript字符串
    var my_regExp=/"(?:\\.|[^\\\"]*"/g;

②创建一个正则表达式的另一个方法是使用RegExp构造器,这个构造器接受一个字符串并把它编译为一个RegExp对象。
    //②RegExp构造器创建RegExp对象匹配JavaScript字符串
    var my_regExp=new RegExp("\"(?:\\.|[^\\\\\\\"])*\"",'g');
第二个参数是指定标志的字符串。RegExp构造器适用于正则表达式必须在运行时动态生成的情形。

③RegExp对象的属性
<1>global  使用表示g时值为true
<2>ignoreCase   使用标志i时值为true
<3>lastIndex    下次exec匹配开始的索引,初始值为0
<4>multiline   使用标志m时值为true
<5>source  正则表达式源代码文本

3.元素
①.一个正则表达式包含一个或者多个正则表达式序列,这些序列被|字符分隔。如果这些序列中任何一项符合匹配条件,那么这么选择就被匹配。
"into".match(/in|int/) 将会匹配in不会匹配int,因为in已经被匹配成功。
②一个正则表达式序列包含一个或者多个正则表达式因子,每个因子能选择是否跟随一个量词,这个量词决定这个因子允许被出现的次数。不指定时匹配一次。

③正则表达式因子
<1>一个正则表达式因子可以是一个字符、一个圆括号包围的组、一个字符类、或者一个转义序列。
<2>一个未被转义的.将匹配除行结束符以外的任何字符。

④正则表达式转义
①\字符在正则表达式因子中:
<1>\f换页符,\n换行符,\r回车符,\t制表符,\u允许指定Unicode字符表示十六进制常量。但\b不是退格符。
<2>\d等同于[0-9]。它匹配一个数字。\D表示与其相反的[^0-9]
<3>\s与\S相反,Unicode空白符的一个不完全子集。
<4>\w等同于[0-9A-Z_a-z],\W与其相反。
<5>\b为一个字边界标志,方便对文本的字边界进行匹配。 
<6>\1是指向分组1所捕获到的文本的一个引用。能够再次被匹配。\2指向分组二,以此类推。

⑤正则表达式分组。
<1>捕获型 一个捕获型分组是一个被包围在圆括号中的正则表达式选择。
<2>非捕获型分组有一个(?:前缀,仅做简单匹配,不会捕获所匹配文本。
<3>向前正向匹配有一个(?=前缀,匹配后文本将会回到它开始的地方,实际上并不匹配任何东西。
<4>向前负向匹配有一个(?!前缀,只有匹配失败时候才进行匹配。

⑥正则表达式类
<1>如果想匹配一个元音字母,可以写作(?:a|e|i|o}u)或者写成一个类[aeiou]
<2>如果[后的第一个字符是^,将会排除这些特殊字符(求反)。

⑦正则表达式类转义
字符类内部转义规则与正则表达式的因子稍有不同,[\b]是退格符, - / [ \ ] ^需要被转义。

⑧ 正则表达式量词
<1>正则表达式因子可以用一个正则表达式量词来决定这个因子应该被匹配的次数,包围在一堆话括号中的一个数字表示这个因子应该被匹配的次数。
/www/匹配的和/w{3}/一样,{3,6}将匹配3~6次,{3,}会匹配三次或者更多。?等同于{0,1},*等同于{0,},+等于{1,}
<2>如果只有一个量词,泽趋向于贪婪性匹配。匹配尽可能多的重复直到上限。若这个量词有一个额外后缀?,则趋向于懒惰行匹配,匹配尽可能少的重复。一般情况最好使用贪婪性匹配。

0 0
原创粉丝点击