您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > JavaScript正则表达式
JavaScript正则表达式正则表达式是一个拆分字符串并查询相关信息的过程。正则表达式通常被称为一个模式(pattern),是一个用简单方式描述或者匹配一系列符合某个语法规则的字符串。一、创建正则表达式ECMAScript通过RegExp类型来支持正则表达式。1.字面量创建正则表达式varexpression=/pattern/flags;2.构造函数创建varexpression=newRegExp(pattern,flags);g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。注意:在开发过程中,如果正则是已知的,则优先选择字面量语法;而构造器方式则是用于运行时,通过动态构建字符串来构建正则表达式。二、RegExp实例属性RegExp每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。global:布尔值,表示是否设置了g标志.ignoreCase:布尔值,表示是否设置了i标志.multiline:布尔值,表示是否设置了m标志.lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起.source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回.示例1:varpattern1=/\[bc\]at/i;//等价于varpattern1=newRegExp(\\[bc\\]at,i);console.log(pattern1.global);//falseconsole.log(pattern1.ignoreCase);//trueconsole.log(pattern1.multiline);//falseconsole.log(pattern1.lastIndex);//0console.log(pattern1.source);//\[bc\]at三、RegExp实例方法1.exec()exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。其中index表示匹配项在字符串的位置,而input表示应用正则表达式的字符串。注意:在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。示例1:vartext=cat,bat,sat,fat;varpattern1=/.at/;varmatches=pattern1.exec(text);console.log(matches.index);//0console.log(matches[0]);//catconsole.log(pattern1.lastIndex);//0matches=pattern1.exec(text);console.log(matches.index);//0console.log(matches[0]);//catconsole.log(pattern1.lastIndex);//0示例2:vartext=cat,bat,sat,fat;varpattern2=/.at/g;varmatches=pattern2.exec(text);console.log(matches.index);//0console.log(matches[0]);//catconsole.log(pattern2.lastIndex);//3matches=pattern2.exec(text);console.log(matches.index);//5console.log(matches[0]);//batconsole.log(pattern2.lastIndex);//82.test()test()接受一个字符串参数。在模式与该参数匹配的情况下返回true;否则,返回false。注意:在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便。示例:vartext=000-00-0000;varpattern=/\d{3}-\d{2}-\d{4}/;if(pattern.test(text)){console.log(Thepatternwasmatched.);}四、正则表达式进阶1.精确匹配如果一个字符不是特殊字符或者操作符,则表示该字符必须在表达式中出现。示例:varpattern=/test/;pattern.test(test);//truepattern.test(testabc);//true注意:要想只允许匹配test,需/^test$/2.匹配一类字符很多时候,我们不想匹配一个特定的字符,而是想匹配一个有限字符集中的某一个字符。可以通过“[]”来实现。示例:varpattern1=/[abc]/;//“a”、“b“、”c“中的任何一个字符varpattern2=/[^abc]/;//除了“a”、“b“、”c“以外的任何一个字符varpattern3=/[a-c]/;//“a”到”c“之间的的任何一个字符(等价于pattern1)3.转义如果我们需要匹配[、$、^、]等特殊字符,在正则中,使用反斜杠可以对任意字符进行转义,让被转义的字符作为本身进行匹配。示例:varpattern1=/\a\/\/;//匹配a/varpattern2=/\w+@\w+\.\w+/;//简单的邮箱匹配4.匹配开始和匹配结束如果正则表达式第一个字符是“^”,则表示要从字符串的开头进行匹配。如果正则表达式最后一个字符是“$”,则表示必须出现在字符串的结尾。/^test/;//只能匹配以“test”开头的字符串/test$/;//只能匹配以“test”结尾的字符串/^L.*G$/;//只能匹配一“L”开头、“G”结尾的字符串5.重复出现/a?/;//零次或一次/a+/;//一次或多次/a*/;//零次或多次/a{4}/;//连续出现四次a/a{4,7}/;//连续出现四次到7次/a{4,}/;//连续出现四次及以上补充:这些重复操作符可以是贪婪的或非贪婪的。默认情况下是贪婪的。在操作符后面加一个问号(?),可以让该表达式变成非贪婪的:进行最小限度的匹配。示例:varpattern1=/a+/;varpattern2=/a+?/;pattern1.exec(aaa);//[aaa]匹配所有三个字符pattern2.exec(aaa);//[a]只匹配一个字符,因为一个a字符就可以满足6.预定义字符类\t水平制表符\b空格\f垂直制表符\r换页符\n回车7.分组使用“()”可以进行分组,当正则表达式有一部分用括号进行分组时,它具有双重责任,同时也创建所谓的捕获。8.或操纵符(OR)可以用“|”表示或的关系示例:/(lg)+|(ligang)+/;//匹配出现一次或多次的“lg”或“ligang”9.反向引用在反斜杠后面加一个要引用的补货数量,该数字从1开始。示例:/^([dtn]a\1)/;//dadtatnan可以任意一个以“d”、“t”、“n”开头,且后面跟着一个“a”字符,最后跟着和第一个捕获相同的字符。注意:/[dtn]a[dtn]/;//可以是datdan等上述二者不同!!!补充:在匹配XML类型的标签元素很有用!/(\w+)(.+)\/\1/;//aclickme/a五、捕获匹配的片段1.执行简单的捕获旧版浏览器声明的透明度规则如下:filter:alpha(opacity=50);通过正则获取其透明度的值:varfilter=alpha(opacity=50);;//opacity=直到出现“)”varresult=filter.match(/opacity=([^)]+)/);console.log(result);//[opacity=50,50]console.log(result[1]/100);//0.5注意:match返回的数组的第一个索引值总是该匹配的完整结果,然后是每个后续捕获结果。2.用全局表达式进行匹配示例1:varhtml=divclass='test'bHello/b/div;varresult=html.match(/(\w+)([^]*?)/);//?为非贪婪模式(上述有提及)console.log(result);//[divclass='test',div,class='test']示例2:varhtml=divclass='test'bHello/b/div;varresult=html.match(/(\w+)([^]*?)/g);console.log(result);//[divclass='test',b]说明:示例1为非全局匹配,返回结果同上述“获取其透明度的值”,只是其包含了两个捕获。示例2为全局匹配,返回全局匹配结果,而不是每个匹配的捕获结果。3.捕获的引用可以引用捕获到的匹配结果的两种方式:一是,自身匹配;二是,替换字符串。方式一:上述“反向引用”已提及,/(\w+)(.+)\/\1/;//aclickme/a方式二:将驼峰变量变为用中划线替换,这在AngularJS等框架中太常见。如:ngClick–ng-clickfunctioncamelCaseToDash(str){//$1即为正则中第一个捕获,同上述的“\1”returnstr.replace(/([A-Z])/g,-$1).toLowerCase();}camelCaseToDash(ngClick);//ng-click4.没有捕获的分组小括号有双重责任:不仅要进行分组操作,还可以指定捕获。如果正则表达式中存在大量的分组,就会引起很多不必要的捕获。在开始括号后面加一个“?:”可以让其不进行捕获。示例:varpattern1=/((ligang-)+)good/;varpattern2=/((?:ligang-)+)good/;//[ligang-ligang-good,ligang-ligang-,ligang-]console.log(ligang-liganggood.match(pattern1));//[ligang-ligang-good,ligang-ligang-]console.log(ligang-liganggood.match(pattern2));六、利用函数进行替换将正则表达式作为replace()方法的第一个参数时,导致在该模式的匹配元素(全局匹配的话,就是多个匹配元素)上进行替换,而不是在固定字符串上进行替换。示例:ABCligangDEF.replace(/[A-Z]/g,'X');//XXXligangXXX其最大的特性是可以接受一个函数作为替换值,而不是一个固定的字符串。函数的返回值是即将替换的值。参数列表:(1)匹配的完整文本(2)匹配的捕获,一个捕获对应一个参数(3)匹配字符在源字符串中的索引(4)源字符串示例:将横线替换成驼峰如:ng-click--ngClickfunctiondashToCamelCase(str){returnstr.replace(/-(\w)/g,function(all,letter){console.log(arguments);returnletter.toUpperCase();});}dashToCamelCase('ng-click');//arguments--[-c,c,2,ng-click]由于全局正则在每一次成功匹配的时候都会调用这样的替换函数。这种技术甚至可以超越简单
本文标题:JavaScript正则表达式
链接地址:https://www.777doc.com/doc-2880444 .html