淘宝京东拼多多购物券网站怎么做,画廊网站建设,长沙网站制作与设计,帝国网站管理系统入门教程1. 正則表達式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号#xff0c;都是普通字符。表达式中的普通字符#xff0c;在匹配一个字符串的时候#xff0c;匹配与之同样的一个字符。 举例1#xff1a;表达式 c都是普通字符。表达式中的普通字符在匹配一个字符串的时候匹配与之同样的一个字符。 举例1表达式 c在匹配字符串 abcde 时匹配结果是成功匹配到的内容是c匹配到的位置是開始于2结束于3。注下标从0開始还是从1開始因当前编程语言的不同而可能不同 举例2表达式 bcd在匹配字符串 abcde 时匹配结果是成功匹配到的内容是bcd匹配到的位置是開始于1结束于4。 1.2 简单的转义字符 一些不便书写的字符採用在前面加 / 的方法。这些字符事实上我们都已经熟知了。 表达式 可匹配 /r, /n 代表回车和换行符 /t 制表符 // 代表 / 本身 还有其它一些在后边章节中有特殊用处的标点符号在前面加 / 后就代表该符号本身。比方^, $ 都有特殊意义假设要想匹配字符串中 ^ 和 $ 字符则表达式就须要写成 /^ 和 /$。 表达式 可匹配 /^ 匹配 ^ 符号本身 /$ 匹配 $ 符号本身 /. 匹配小数点.本身 这些转义字符的匹配方法与 普通字符 是相似的。也是匹配与之同样的一个字符。 举例1表达式 /$d在匹配字符串 abc$de 时匹配结果是成功匹配到的内容是$d匹配到的位置是開始于3结束于5。 1.3 可以与 多种字符 匹配的表达式 正則表達式中的一些表示方法能够匹配 多种字符 当中的随意一个字符。比方表达式 /d 能够匹配随意一个数字。尽管能够匹配当中随意字符可是仅仅能是一个不是多个。这就好比玩扑克牌时候大小王能够取代随意一张牌可是仅仅能取代一张牌。 表达式 可匹配 /d 随意一个数字0~9 中的随意一个 /w 随意一个字母或数字或下划线也就是 A~Z,a~z,0~9,_ 中随意一个 /s 包含空格、制表符、换页符等空白字符的当中随意一个 . 小数点能够匹配除了换行符/n以外的随意一个字符 举例1表达式 /d/d在匹配 abc123 时匹配的结果是成功匹配到的内容是12匹配到的位置是開始于3结束于5。 举例2表达式 a./d在匹配 aaa100 时匹配的结果是成功匹配到的内容是aa1匹配到的位置是開始于1结束于4。 1.4 自己定义可以匹配 多种字符 的表达式 使用方括号 [ ] 包括一系列字符可以匹配当中随意一个字符。用 [^ ] 包括一系列字符则可以匹配当中字符之外的随意一个字符。相同的道理尽管可以匹配当中随意一个可是仅仅能是一个不是多个。 表达式 可匹配 [ab5] 匹配 a 或 b 或 5 或 [^abc] 匹配 a,b,c 之外的随意一个字符 [f-k] 匹配 f~k 之间的随意一个字母 [^A-F0-3] 匹配 A~F,0~3 之外的随意一个字符 举例1表达式 [bcd][bcd] 匹配 abc123 时匹配的结果是成功匹配到的内容是bc匹配到的位置是開始于1结束于3。 举例2表达式 [^abc] 匹配 abc123 时匹配的结果是成功匹配到的内容是1匹配到的位置是開始于3结束于4。 1.5 修饰匹配次数的特殊符号 前面章节中讲到的表达式不管是仅仅能匹配一种字符的表达式还是能够匹配多种字符当中随意一个的表达式都仅仅能匹配一次。假设使用表达式再加上修饰匹配次数的特殊符号那么不用反复书写表达式就能够反复匹配。 用法是次数修饰放在被修饰的表达式后边。比方[bcd][bcd] 能够写成 [bcd]{2}。 表达式 作用 {n} 表达式反复n次比方/w{2} 相当于 /w/wa{5} 相当于 aaaaa {m,n} 表达式至少反复m次最多反复n次比方ba{1,3}能够匹配 ba或baa或baaa {m,} 表达式至少反复m次比方/w/d{2,}能够匹配 a12,_456,M12344... ? 匹配表达式0次或者1次相当于 {0,1}比方a[cd]?能够匹配 a,ac,ad 表达式至少出现1次相当于 {1,}比方ab能够匹配 ab,aab,aaab... * 表达式不出现或出现随意次相当于 {0,}比方/^*b能够匹配 b,^^^b... 举例1表达式 /d/.?/d* 在匹配 It costs $12.5 时匹配的结果是成功匹配到的内容是12.5匹配到的位置是開始于10结束于14。 举例2表达式 go{2,8}gle 在匹配 Ads by goooooogle 时匹配的结果是成功匹配到的内容是goooooogle匹配到的位置是開始于7结束于17。 1.6 其它一些代表抽象意义的特殊符号 一些符号在表达式中代表抽象的特殊意义 表达式 作用 ^ 与字符串開始的地方匹配不匹配不论什么字符 $ 与字符串结束的地方匹配不匹配不论什么字符 /b 匹配一个单词边界也就是单词和空格之间的位置不匹配不论什么字符 进一步的文字说明仍然比較抽象因此举例帮助大家理解。 举例1表达式 ^aaa 在匹配 xxx aaa xxx 时匹配结果是失败。由于 ^ 要求与字符串開始的地方匹配因此仅仅有当 aaa 位于字符串的开头的时候^aaa 才干匹配比方aaa xxx xxx。 举例2表达式 aaa$ 在匹配 xxx aaa xxx 时匹配结果是失败。由于 $ 要求与字符串结束的地方匹配因此仅仅有当 aaa 位于字符串的结尾的时候aaa$ 才干匹配比方xxx xxx aaa。 举例3表达式 ./b. 在匹配 abc 时匹配结果是成功匹配到的内容是a匹配到的位置是開始于2结束于4。 进一步说明/b 与 ^ 和 $ 相似本身不匹配不论什么字符可是它要求它在匹配结果中所处位置的左右两边当中一边是 /w 范围还有一边是 非/w 的范围。 举例4表达式 /bend/b 在匹配 weekend,endfor,end 时匹配结果是成功匹配到的内容是end匹配到的位置是開始于15结束于18。 一些符号能够影响表达式内部的子表达式之间的关系 表达式 作用 | 左右两边表达式之间 或 关系匹配左边或者右边 ( ) (1). 在被修饰匹配次数的时候括号里的表达式能够作为总体被修饰(2). 取匹配结果的时候括号里的表达式匹配到的内容能够被单独得到 举例5表达式 Tom|Jack 在匹配字符串 Im Tom, he is Jack 时匹配结果是成功匹配到的内容是Tom匹配到的位置是開始于4结束于7。匹配下一个时匹配结果是成功匹配到的内容是Jack匹配到的位置时開始于15结束于19。 举例6表达式 (go/s*) 在匹配 Lets go go go! 时匹配结果是成功匹配到内容是go go go匹配到的位置是開始于6结束于14。 举例7表达式 (/d/.?/d*) 在匹配 10.9,20.5 时匹配的结果是成功匹配到的内容是20.5匹配到的位置是開始于6结束于10。单独获取括号范围匹配到的内容是20.5。 2. 正則表達式中的一些高级规则 2.1 匹配次数中的贪婪与非贪婪 在使用修饰匹配次数的特殊符号时有几种表示方法可以使同一个表达式可以匹配不同的次数比方{m,n}, {m,}, ?, *, 详细匹配的次数随被匹配的字符串而定。这样的反复匹配不定次数的表达式在匹配过程中总是尽可能多的匹配。比方针对文本 dxxxdxxxd举比例如以下 表达式 匹配结果 (d)(/w) /w 将匹配第一个 d 之后的全部字符 xxxdxxxd (d)(/w)(d) /w 将匹配第一个 d 和最后一个 d 之间的全部字符 xxxdxxx。尽管 /w 也可以匹配上最后一个 d可是为了使整个表达式匹配成功/w 可以 让出 它本来可以匹配的最后一个 d 由此可见/w 在匹配的时候总是尽可能多的匹配符合它规则的字符。尽管第二个举例中它没有匹配最后一个 d但那也是为了让整个表达式可以匹配成功。同理带 * 和 {m,n} 的表达式都是尽可能地多匹配带 ? 的表达式在可匹配可不匹配的时候也是尽可能的 要匹配。这 种匹配原则就叫作 贪婪 模式 。 非贪婪模式 在修饰匹配次数的特殊符号后再加上一个 ? 号则能够使匹配次数不定的表达式尽可能少的匹配使可匹配可不匹配的表达式尽可能的 不匹配。这样的匹配原则叫作 非贪婪 模式也叫作 勉强 模式。假设少匹配就会导致整个表达式匹配失败的时候与贪婪模式相似非贪婪模式会最小限度的再匹配一些以使整个表达式匹配成功。举比例如以下针对文本 dxxxdxxxd 举例 表达式 匹配结果 (d)(/w?) /w? 将尽可能少的匹配第一个 d 之后的字符结果是/w? 仅仅匹配了一个 x (d)(/w?)(d) 为了让整个表达式匹配成功/w? 不得不匹配 xxx 才干够让后边的 d 匹配从而使整个表达式匹配成功。因此结果是/w? 匹配 xxx 很多其它的情况举比例如以下 举例1表达式 td(.*)/td 与字符串 tdpaa/p/td tdpbb/p/td 匹配时匹配的结果是成功匹配到的内容是 tdpaa/p/td tdpbb/p/td 整个字符串 表达式中的 /td 将与字符串中最后一个 /td 匹配。 举例2相比之下表达式 td(.*?)/td 匹配举例1中相同的字符串时将仅仅得到 tdpaa/p/td 再次匹配下一个时能够得到第二个 tdpbb/p/td。 2.2 反向引用 /1, /2... 表达式在匹配时表达式引擎会将小括号 ( ) 包括的表达式所匹配到的字符串记录下来。在获取匹配结果的时候小括号包括的表达式所匹配到的字符串能够单独获取。这一点在前面的举例中已经多次展示了。在实际应用场合中当用某种边界来查找而所要获取的内容又不包括边界时必须使用小括号来指定所要的范围。比方前面的 td(.*?)/td。 事实上小括号包括的表达式所匹配到的字符串 不仅是在匹配结束后才干够使用在匹配过程中也能够使用。表达式后边的部分能够引用前面 括号内的子匹配已经匹配到的字符串。引用方法是 / 加上一个数字。/1 引用第1对括号内匹配到的字符串/2 引用第2对括号内匹配到的字符串……以此类推假设一对括号内包括还有一对括号则外层的括号先排序号。换句话说哪一对的左括号 ( 在前那这一对就先排序号。 举比例如以下 举例1表达式 (|)(.*?)(/1) 在匹配 Hello, World 时匹配结果是成功匹配到的内容是 Hello 。再次匹配下一个时能够匹配到 World 。 举例2表达式 (/w)/1{4,} 在匹配 aa bbbb abcdefg ccccc 111121111 999999999 时匹配结果是成功匹配到的内容是 ccccc。再次匹配下一个时将得到 999999999。这个表达式要求 /w 范围的字符至少反复5次注意与 /w{5,} 之间的差别。 举例3表达式 (/w)/s*(/w((|).*?/4)?/s*)*.*?//1 在匹配 td idtd1 stylebgcolor:white/td 时匹配结果是成功。假设 td 与 /td 不配对则会匹配失败假设改成其它配对也能够匹配成功。 2.3 预搜索不匹配反向预搜索不匹配 前面的章节中我讲到了几个代表抽象意义的特殊符号^$/b。它们都有一个共同点那就是它们本身不匹配不论什么字符仅仅是对 字符串的两头 或者 字符之间的缝隙 附加了一个条件。理解到这个概念以后本节将继续介绍第二种对 两头 或者 缝隙 附加条件的更加灵活的表示方法。 正向预搜索(?xxxxx)(?!xxxxx) 格式(?xxxxx)在被匹配的字符串中它对所处的 缝隙 或者 两头 附加的条件是所在缝隙的右側必须能够匹配上 xxxxx 这部分的表达式。由于它仅仅是在此作为这个缝隙上附加的条件所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就相似 /b本身不匹配不论什么字符。/b 仅仅是将所在缝隙之前、之后的字符取来进行了一下推断不会影响后边的表达式来真正的匹配。 举例1表达式 Windows (?NT|XP) 在匹配 Windows 98, Windows NT, Windows 2000 时将仅仅匹配 Windows NT 中的 Windows 其它的 Windows 字样则不被匹配。 举例2表达式 (/w)((?/1/1/1)(/1)) 在匹配字符串 aaa ffffff 999999999 时将能够匹配6个f的前4个能够匹配9个9的前7个。这个表达式能够读解成反复4次以上的字母数字则匹配其剩下最后2位之前的部分。当然这个表达式能够不这样写在此的目的是作为演示之用。 格式(?!xxxxx)所在缝隙的右側必须不能匹配 xxxxx 这部分表达式。 举例3表达式 ((?!/bstop/b).) 在匹配 fdjka ljfdl stop fjdsla fdj 时将从头一直匹配到 stop 之前的位置假设字符串中没有 stop则匹配整个字符串。 举例4表达式 do(?!/w) 在匹配字符串 done, do, dog 时仅仅能匹配 do。在本条举例中do 后边使用 (?!/w) 和使用 /b 效果是一样的。 反向预搜索(?xxxxx)(?!xxxxx) 这两种格式的概念和正向预搜索是相似的反向预搜索要求的条件是所在缝隙的 左側两种格式分别要求必须可以匹配和必须不可以匹配指定表达式而不是去推断右側。与 正向预搜索 一样的是它们都是对所在缝隙的一种附加条件本身都不匹配不论什么字符。 举例5表达式 (?/d{4})/d(?/d{4}) 在匹配 1234567890123456 时将匹配除了前4个数字和后4个数字之外的中间8个数字。因为 JScript.RegExp 不支持反向预搜索因此本条举例不可以进行演示。非常多其它的引擎可以支持反向预搜索比方Java 1.4 以上的 java.util.regex 包.NET 中System.Text.RegularExpressions 命名空间以及本站推荐的最简单易用的 DEELX 正则引擎。 3. 其它通用规则 另一些在各个正則表達式引擎之间比較通用的规则在前面的解说过程中没有提到。 3.1 表达式中能够使用 /xXX 和 /uXXXX 表示一个字符X 表示一个十六进制数 形式 字符范围 /xXX 编号在 0 ~ 255 范围的字符比方空格能够使用 /x20 表示 /uXXXX 不论什么字符能够使用 /u 再加上其编号的4位十六进制数表示比方/中 3.2 在表达式 /s/d/w/b 表示特殊意义的同一时候相应的大写字母表示相反的意义 表达式 可匹配 /S 匹配全部非空白字符/s 可匹配各个空白字符 /D 匹配全部的非数字字符 /W 匹配全部的字母、数字、下划线以外的字符 /B 匹配非单词边界即左右两边都是 /w 范围或者左右两边都不是 /w 范围时的字符缝隙 3.3 在表达式中有特殊意义须要加入 / 才干匹配该字符本身的字符汇总 字符 说明 ^ 匹配输入字符串的開始位置。要匹配 ^ 字符本身请使用 /^ $ 匹配输入字符串的结尾位置。要匹配 $ 字符本身请使用 /$ ( ) 标记一个子表达式的開始和结束位置。要匹配小括号请使用 /( 和 /) [ ] 用来自己定义可以匹配 多种字符 的表达式。要匹配中括号请使用 /[ 和 /] { } 修饰匹配次数的符号。要匹配大括号请使用 /{ 和 /} . 匹配除了换行符/n以外的随意一个字符。要匹配小数点本身请使用 /. ? 修饰匹配次数为 0 次或 1 次。要匹配 ? 字符本身请使用 /? 修饰匹配次数为至少 1 次。要匹配 字符本身请使用 / * 修饰匹配次数为 0 次或随意次。要匹配 * 字符本身请使用 /* | 左右两边表达式之间 或 关系。匹配 | 本身请使用 /| 3.4 括号 ( ) 内的子表达式假设希望匹配结果不进行记录供以后使用能够使用 (?:xxxxx) 格式 举例1表达式 (?:(/w)/1) 匹配 a bbccdd efg 时结果是 bbccdd。括号 (?:) 范围的匹配结果不进行记录因此 (/w) 使用 /1 来引用。 3.5 经常使用的表达式属性设置简单介绍IgnorecaseSinglelineMultilineGlobal 表达式属性 说明 Ignorecase 默认情况下表达式中的字母是要区分大写和小写的。配置为 Ignorecase 可使匹配时不区分大写和小写。有的表达式引擎把 大写和小写 概念延伸至 UNICODE 范围的大写和小写。 Singleline 默认情况下小数点 . 匹配除了换行符/n以外的字符。配置为 Singleline 可使小数点可匹配包含换行符在内的全部字符。 Multiline 默认情况下表达式 ^ 和 $ 仅仅匹配字符串的開始 ① 和结尾 ④ 位置。如①xxxxxxxxx②/n③xxxxxxxxx④配置为 Multiline 能够使 ^ 匹配 ① 外还能够匹配换行符之后下一行開始前 ③ 的位置使 $ 匹配 ④ 外还能够匹配换行符之前一行结束 ② 的位置。 Global 主要在将表达式用来替换时起作用配置为 Global 表示替换全部的匹配。 4. 其它提示 4.1 假设想要了解高级的正则引擎还支持那些复杂的正则语法可參见本站 DEELX 正则引擎的说明文档。 4.2 假设要要求表达式所匹配的内容是整个字符串而不是从字符串中找一部分那么能够在表达式的首尾使用 ^ 和 $比方^/d$ 要求整个字符串仅仅有数字。 4.3 假设要求匹配的内容是一个完整的单词而不会是单词的一部分那么在表达式首尾使用 /b比方使用 /b(if|while|else|void|int……)/b 来匹配程序中的keyword。 4.4 表达式不要匹配空字符串。否则会一直得到匹配成功而结果什么都没有匹配到。比方准备写一个匹配 123、123.、123.5、.5 这几种形式的表达式时整数、小数点、小数数字都能够省略可是不要将表达式写成/d*/.?/d*由于假设什么都没有这个表达式也能够匹配成功。更好的写法是/d/.?/d*|/./d。 4.5 能匹配空字符串的子匹配不要循环无限次。假设括号内的子表达式中的每一部分都能够匹配 0 次而这个括号总体又能够匹配无限次那么情况可能比上一条所说的更严重匹配过程中可能死循环。尽管如今有些正則表達式引擎已经通过办法避免了这样的情况出现死循环了比方 .NET 的正則表達式可是我们仍然应该尽量避免出现这样的情况。假设我们在写表达式时遇到了死循环也能够从这一点入手查找一下是否是本条所说的原因。 4.6 合理选择贪婪模式与非贪婪模式參见话题讨论。 4.7 或 | 的左右两边对某个字符最好仅仅有一边能够匹配这样不会由于 | 两边的表达式由于交换位置而有所不同。 ------------------------------------------------------------------------------------------下一篇 1定义正則表達式 1定义正則表達式有两种形式一种是普通方式一种是构造函数方式。2普通方式var reg/表达式/附加參数表达式一个字符串代表了某种规则当中能够使用某些特殊字符来代表特殊的规则后面会具体说明。附加參数用来扩展表达式的含义眼下主要有三个參数g代表能够进行全局匹配。i代表不区分大写和小写匹配。m代表能够进行多行匹配。上面三个參数能够随意组合代表复合含义当然也能够不加參数。样例var reg/a*b/;var reg/abcf/g;3构造函数方式var regnew RegExp(“表达式”,”附加參数”);当中“表达式”与“附加參数”的含义与上面那种定义方式中的含义同样。样例var regnew RegExp(“a*b”);var regnew RegExp(“abcf”,”g”);4普通方式与构造函数方式的差别普通方式中的表达式必须是一个常量字符串而构造函数中的表达式能够是常量字符串也能够是一个js变量比如依据用户的输入来作为表达式參数等等var regnew RegExp(document.forms[0].exprfiled.value,”g”); 2表达式模式 1表达式模式是指表达式的表达方式与样式 即 var reg/表达式/附加參数 中的“表达式”如何去描写叙述2从规范上讲表达式模式分为简单模式和复合模式。3简单模式是指通过普通字符的组合来表达的模式比如var reg/abc0d/;可见简单模式仅仅能表示详细的匹配。4复合模式是指含有通配符来表达的模式比如var reg/ab?/w/;当中的、?和/w都属于通配符代表着特殊的含义。因此复合模式能够表达更为抽象化的逻辑。以下我们着重说一下复合模式中各个通配符的含义及其使用。5)复合模式中特殊字符的解说 1/在很多编程语言里面被用作转义符一般来说/符号后面假设跟的是普通字符c那么/c就代表特殊的含义比如n本来代表字符n但/n就代表换行。/符号后面假设跟的是特殊字符c那么/c就代表普通字符c比如/一般用作转义符但//则调表普通字符/。Javascript的正則表達式中/的使用方法与上面同样仅仅是不同的编程语言特殊字符表可能不太一样罢了。 2^匹配输入字符串的起始端假设是多行匹配即表达式的附加參数中含有m则也在一个换行符后匹配。样例/^B/匹配 “Bab Bc ”中的第一个B样例2/^B/gm匹配 “Badd B cdaf B dsfB” 中的第一行第一个B第三行中的第一个B 3$匹配输入字符创的尾端假设是多行匹配即表达式的附加參数中含有m则也在一个换行符前匹配。与^的使用方法相反。样例/t$/匹配“bat”中的t可是不匹配“hate”中的t样例2/t$/匹配“tag atbat”中第一行的最后一个t和第二行的t。 4*匹配前一个字符0次或多次。样例/ab*/匹配“dddabbbbc”中的“abbbb”也匹配“ddda”中的“a” 5匹配前一个字符1次或多次。样例/ab/匹配“dddabbbbc”中的“abbbb”但不匹配“ddda”与后面的{1,}原型{n,}的使用方法相似 6??的使用方法比較特殊一般来说它用来对前一个字符做0次或1次匹配可是它有另外两种特殊的使用方法假设紧跟在*、、?和{ }之后则表示原始匹配的最小次数匹配比如/ba*/本来匹配“bbbaaaa”中的“baaaa”可是/ba*?/则匹配“bbbaaaa”中的“b”由于*表示0次或多次匹配而加?应该表示最少次数匹配即0次匹配。同理/ba?/则匹配“baaaa”中的“ba”。作为语法结构符号使用于前置断言中即后面要说到的x(?y)和x(?!y) 7.小数点中的“.”号匹配不论什么一个单独的字符可是换行符除外。标准中总共同拥有哪些字符请參考字符集比如/a.b/匹配“acbaa”中的“acb”可是不匹配“abbb”。 8(x)表示匹配x(并不是特指字符x或者特指一个字符x表示一个字符串)并且匹配会被记住在语法中这样的()被称为“capturing parentheses ”即捕捉用的小括号。匹配会被记住是由于在表达式提供的函数中有些函数返回一个数组该数组会保存所匹配的全部字符串比如exec()函数。另外还要注意()中的x被记住的前提是匹配x。样例1var regx/a(b)c/;var rsregx.exec(“abcddd”);从上面能够看出,/a(b)c/匹配“abcddd”中的“abc”由于()的原因b也会记录下来因此rs返回的数字内容为{abc,b}样例2var regx/a(b)c/;var rsregx.exec(“acbcddd”);rs返回null由于/a(b)c/不匹配“acbcddd”所以()中的b不会被记录下来虽然字符串中含有b9(?:x)匹配x但不会记住x这样的格式中的()被称为“non-capturing parentheses ”即非捕捉用的小括号。样例var regx/a(?:b)c/;var rsregx.exec(“abcddd”);从上面能够看出,/a(?:b)c/匹配“abcddd”中的“abc”由于(?:)的原因b不会记录下来因此rs返回的数字内容为{abc} 10X(?y)匹配x仅当后面紧跟着y时。假设符合匹配则仅仅有x会被记住y不会被记住。样例var regx/user(?name)/;var rsregx.exec(“The username is Mary”);结果匹配成功并且rs的值为{user} 11X(?!y)匹配x仅当后面不紧跟着y时。假设符合匹配则仅仅有x会被记住y不会被记住。样例var regx/user(?!name)/;var rsregx.exec(“The user name is Mary”);结果匹配成功并且rs的值为{user}样例2var regx//d(?!/.)/;var rsregx.exec(“54.235”);结果匹配成果rs的值为{5}不匹配54是由于54后面跟着“.”号当然235也匹配可是由于exec方法的行为235不会被返回 12x|y匹配x或y。注意假设x和y都匹配上了那么仅仅记住x。样例var regx/beijing|shanghai/;var rsregx.exec(“I love beijing and shanghai”);结果匹配成功rs的值为{beijing}尽管shanghai也匹配但不会被记住。 13{n}匹配前一个字符的n次出现。n必须是一个非负数当然假设是一个负数或小数也不会报语法错误。样例var regx/ab{2}c/;var rsregx.exec(“abbcd”);结果匹配成功rs的值为{abbc}。 14{n,}匹配前一个字符的至少n次出现。样例var regx/ab{2,}c/;var rsregx.exec(“abbcdabbbc”);结果匹配成功rs的值为{abbc}。注意为什么abbbc也符合条件为什么没有被记住这与exec方法的行为有关后面会统一解说。 15{n,m}匹配前一个字符的至少n次最多m次的出现。仅仅要n与m为数字并且mn就不会报语法错误。样例var regx/ab{2,5}c/;var rsregx.exec(“abbbcd”);结果匹配成功rs的值为{abbbc}。样例2var regx/ab{2,2}c/;var rsregx.exec(“abbcd”);结果匹配成功rs的值为{abbc}。样例3var regx/ab(2,5)/;var rsregx.exec(“abbbbbbbbbb”);结果匹配成功rs的值为{abbbbb}这说明假设前一个字符出现多于m次则仅仅匹配m次。另外var regx/ab(2,5)c/;var rsregx.exec(“abbbbbbbbbbc”);结果匹配失败rs的值为null为什么匹配失败由于b多于5个则b(2,5)会匹配前5个b而表达式/ab(2,5)c/中b后面是c但字符串中5个b之后还是b所以会报错。 16[xyz]xyz表示一个字符串该模式表示匹配[]中的一个字符形式上[xyz]等同于[x-z]。样例var regx/a[bc]d/;var rsregx.exec(“abddgg”);结果匹配成功rs的值为{abd}样例2var regx/a[bc]d/;var rsregx.exec(“abcd”);结果匹配失败rs的值为null之所以失败是由于[bc]表示匹配b或c中的一个但不会同一时候匹配。 17[^xyz]该模式表示匹配非[]中的一个字符形式上[^xyz]等同于[^x-z]。样例var regx/a[^bc]d/;var rsregx.exec(“afddgg”);结果匹配成功rs的值为{afd}样例2var regx/a[^bc]d/;var rsregx.exec(“abd”);结果匹配失败rs的值为。 18[/b]匹配退格键。 19/b匹配一个词的边界符比如空格和换行符等等当然匹配换行符时表达式应该附加參数m。样例var regx//bc./;var rsregx.exec(“Beijing is a beautiful city”);结果匹配成功rs的值为{ci}注意c前边的空格不会匹配到结果中即{ ci}是不对的。 20/B代表一个非单词边界。样例var regx//Bi./;var rsregx.exec(“Beijing is a beautiful city”);结果匹配成功rs的值为{ij}即匹配了Beijing中的ij。 21/cX匹配一个控制字符。比如 /cM 匹配一个 Control-M 或 回车符。 x 的值必须为 A-Z 或 a-z 之中的一个。否则将 c 视为一 个原义的 ’c’ 字符。实际的样例还需补充 21/d匹配一个数字字符等同于[0-9]。样例var regx/user/d/;var rsregx.exec(“user1”);结果匹配成功rs的值为{user1} 22/D匹配一个非数字字符等同于[^0-9]。样例var regx/user/D/;var rsregx.exec(“userA”);结果匹配成功rs的值为{userA} 23/f匹配一个换页符。 24/n匹配一个换行符。由于是换行符所以在表达式中要增加m參数。样例var regx/a/nbc/m; var str“a bc”; var rsregx.exec(str); 结果匹配成功rs的值为{ }假设表达式为/a/n/rbc/则不会被匹配因此在一般的编辑器中一个”Enter”键代表着“回车换行”而非“换行回车”至少在textarea域中是这种。 25/r匹配一个回车符 26/s匹配一个空格符等同于[ /f/n/r/t/v/u00A0/u2028/u2029].样例var regx//si/;var rsregx.exec(“Beijing is a city”);结果匹配成功rs的值为{ i} 27/S匹配一个非空格符等同于[ ^/f/n/r/t/v/u00A0/u2028/u2029].样例var regx//Si/;var rsregx.exec(“Beijing is a city”);结果匹配成功rs的值为{ei} 28/t匹配一个tab样例var regx/a/tb/;var rsregx.exec(“a bc”);结果匹配成功rs的值为 {a bc} 29/v匹配一个竖向的tab 30/w匹配一个数字、_或字母表字符即[A-Za-z0-9_ ]。样例var regx//w/;var rsregx.exec(“$25.23”);结果匹配成功rs的值为{2} 31/W匹配一个非数字、_或字母表字符即[^A-Za-z0-9_ ]。样例var regx//w/;var rsregx.exec(“$25.23”);结果匹配成功rs的值为{$} 32/n注意不是/n这里n是一个正整数表示匹配第n个()中的字符。样例var regx/user([,-])group/1role/;var rsregx.exec(“user-group-role”);结果匹配成功rs的值为{user-group-role,-}相同对user,group,role的匹配也是成功的但像user-group,role等就不正确了。 33/0匹配一个NUL字符。 34/xhh匹配一个由两位16进制数字所表达的字符。 35/uhhhh匹配一个由四位16进制数字所表达的字符。 3表达式操作 1表达式操作在这里是指和表达式相关的方法我们将介绍六个方法。2表达式对象RegExp方法 1exec(str)返回str中与表达式相匹配的第一个字符串并且以数组的形式表现当然假设表达式中含有捕捉用的小括号则返回的数组中也可能含有()中的匹配字符串比如var regx//d/;var rsregx.exec(“3432ddf53”);返回的rs值为{3432}var regx2new RegExp(“ab(/d)c”);var rs2regx2.exec(“ab234c44”);返回的rs值为{ab234c,234}另外假设有多个合适的匹配则第一次运行exec返回一个第一个匹配此时继续运行exec则依次返回第二个第三个匹配。比如var regx/user/d/g;var rsregx.exec(“ddduser1dsfuser2dd”);var rs1regx.exec(“ddduser1dsfuser2dd”);则rs的值为{user1}rs的值为{rs2}当然注意regx中的g參数是必须的否则不管exec运行多少次都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。 2test(str)推断字符串str是否匹配表达式返回一个布尔值。比如var regx/user/d/g;var flagregx.test(“user12dd”);flag的值为true。 3String对象方法 1match(expr)返回与expr相匹配的一个字符串数组假设没有加參数g则返回第一个匹配增加參数g则返回全部的匹配样例var regx/user/d/g;var str“user13userddduser345”;var rsstr.match(regx);rs的值为{user1,user3} 2search(expr)返回字符串中与expr相匹配的第一个匹配的index值。样例var regx/user/d/g;var str“user13userddduser345”;var rsstr.search(regx);rs的值为0 3replace(expr,str)将字符串中匹配expr的部分替换为str。另外在replace方法中str中能够含有一种变量符号$格式为$n代表匹配中被记住的第n的匹配字符串注意小括号能够记忆匹配。样例var regx/user/d/g;var str“user13userddduser345”;var rsstr.replace(regx,”00”);rs的值为003userddd0045样例2var regx/u(se)r/d/g;var str“user13userddduser345”;var rsstr.replace(regx,”$1”);rs的值为se3userdddse45对于replace(expr,str)方法还要特别注意一点假设expr是一个表达式对象则会进行全局替换此时表达式必须附加參数g否则也仅仅是替换第一个匹配假设expr是一个字符串对象则仅仅会替换第一个匹配的部分比如var regx“user”var str“user13userddduser345”;var rsstr.replace(regx,”00”);rs的值为 0013userddduser345 4split(expr)将字符串以匹配expr的部分做切割返回一个数组并且表达式是否附加參数g都没有关系结果是一样的。样例var regx/user/d/g;var str“user13userddduser345”;var rsstr.split(regx);rs的值为{3userddd,45} 4表达式相关属性 1表达式相关属性是指和表达式相关的属性如以下的形式var regx/myexpr/;var rsregx.exec(str);当中和表达式自身regx相关的属性有两个和表达式匹配结果rs相关的属性有三个以下将逐一介绍。2和表达式自身相关的两个属性 1lastIndex返回開始下一个匹配的位置注意必须是全局匹配表达式中带有g參数时lastIndex才会有不断返回下一个匹配值否则该值为总是返回第一个下一个匹配位置比如var regx/user/d/;var rsregx.exec(“sdsfuser1dfsfuser2”);var lastIndex1regx.lastIndex;rsregx.exec(“sdsfuser1dfsfuser2”);var lastIndex2regx.lastIndex;rsregx.exec(“sdsfuser1dfsfuser2”);var lastIndex3regx.lastIndex; 上面lastIndex1为9第二个lastIndex2也为9第三个也是9假设regx/user/d/g则第一个为9第二个为18第三个为0。 2source返回表达式字符串自身。比如var regx/user/d/;var rsregx.exec(“sdsfuser1dfsfuser2”);var sourceregx.source;source的值为user/d3和匹配结果相关的三个属性 1index返回当前匹配的位置。比如var regx/user/d/;var rsregx.exec(“sdsfuser1dfsfuser2”);var index1rs.index;rsregx.exec(“sdsfuser1dfsfuser2”);var index2rs.index; rsregx.exec(“sdsfuser1dfsfuser2”);var index3rs.index; index1为4index2为4index3为4假设表达式增加參数g则index1为4index2为13index3会报错index为空或不是对象。 2input用于匹配的字符串。比如var regx/user/d/;var rsregx.exec(“sdsfuser1dfsfuser2”);var inputrs.input;input的值为sdsfuser1dfsfuser2。 3[0]返回匹配结果中的第一个匹配值对于match而言可能返回一个多值的数字则除了[0]外还能够取[1]、[2]等等。比如var regx/user/d/;var rsregx.exec(“sdsfuser1dfsfuser2”);var value1rs[0];rsregx.exec(“sdsfuser1dfsfuser2”);var value2rs[0]; value1的值为user1,value2的值为user2 5实际应用 1实际应用一描写叙述有一表单当中有一个“用户名”input域要求汉字并且不能少于2个汉字不能多于4个汉字。实现scriptfunction checkForm(obj){ var usernameobj.username.value; var regx/^[/u4e00-/u9fa5]{2,4}$/g if(!regx.test(username)){ alert(“Invalid username!”); return false; } return true;}/scriptform name“myForm”onSubmit“return checkForm(this)” input type“text” name“username”/ input type“submit” vlaue“submit”//form2实际应用二描写叙述给定一个含有html标记的字符串要求将当中的html标记去掉。实现scriptfunction toPlainText(htmlStr){ var regx/[^]*|//[^]*/gm; var strhtmlStr.replace(regx,); return str;}/scriptform name“myForm” textarea id“htmlInput”/textarea input type“button” value“submit” οnclick“toPlainText(document.getElementById(‘htmlInput’).value”//form 三小结 1Javascript正則表達式我想在一般的程序猿之中使用者应该不是非常多由于我们处理的页面一般都不是非常复杂而复杂的逻辑一般我们都在后台处理完毕了。可是眼下趋势已经出现了扭转富client已经被越来越多的人接受而Javascript就是当中的关键技术对于复杂的client逻辑而言正則表達式的作用也是非常关键的同一时候它也是Javascript高手必需要掌握的重要技术之中的一个。 2为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识我将前面的一些关键点和easy犯糊涂的地方再系统总结一下这部分非常关键总结1附件參数g的使用方法表达式加上參数g之后表明能够进行全局匹配注意这里“能够”的含义。我们具体叙述1对于表达式对象的exec方法不增加g则仅仅返回第一个匹配不管运行多少次均是如此假设增加g则第一次运行也返回第一个匹配再运行返回第二个匹配依次类推。比如var regx/user/d/;var str“user18dsdfuser2dsfsd”;var rsregx.exec(str);//此时rs的值为{user1}var rs2regx.exec(str);//此时rs的值依旧为{user1}假设regx/user/d/g则rs的值为{user1}rs2的值为{user2}通过这个样例说明对于exec方法表达式增加了g并非说运行exec方法就能够返回全部的匹配而是说增加了g之后我能够通过某种方式得到全部的匹配这里的“方式”对于exec而言就是依次运行这种方法就可以。2对于表达式对象的test方法增加g于不加上g没有什么差别。3对于String对象的match方法不增加g也仅仅是返回第一个匹配一直运行match方法也总是返回第一个匹配增加g则一次返回全部的匹配注意这与表达式对象的exec方法不同对于exec而言表达式即使加上了g也不会一次返回全部的匹配。比如var regx/user/d/;var str“user1sdfsffuser2dfsdf”;var rsstr.match(regx);//此时rs的值为{user1}var rs2str.match(regx);//此时rs的值依旧为{user1}假设regx/user/d/g则rs的值为{user1,user2}rs2的值也为{user1,user2}4对于String对象的replace方法表达式不增加g则仅仅替换第一个匹配假设增加g则替换全部匹配。开头的三道測试题能非常好的说明这一点5对于String对象的split方法加上g与不加g是一样的即var sep/user/d/;var array“user1dfsfuser2dfsf”.split(sep);则array的值为{dfsf, dfsf}此时sep/user/d/g返回值是一样的。6对于String对象的search方法加不加g也是一样的。总结2附加參数m的使用方法附加參数m表明能够进行多行匹配可是这个仅仅有当使用^和$模式时才会起作用在其它的模式中加不增加m都能够进行多行匹配事实上说多行的字符串也是一个普通字符串我们举例说明这一点1使用^的样例var regx/^b./g;var str“bd76 dfsdf sdfsdfs dffs b76dsf sdfsdf”;var rsstr.match(regx);此时增加g和不增加g都仅仅返回第一个匹配{bd}假设regx/^b./gm则返回全部的匹配{bd,b7}注意假设regx/^b./m则也仅仅返回第一个匹配。所以增加m表明能够进行多行匹配增加g表明能够进行全局匹配综合到一起就是能够进行多行全局匹配2使用其它模式的样例比如var regx/user/d/;var str“sdfsfsdfsdf sdfsuser3 dffs b76dsf user6”;var rsstr.match(regx);此时不加參数g则返回{user3}增加參数g返回{user3,user6}加不增加m对此没有影响。3因此对于m我们要清楚它的使用记住它仅仅对^和$模式起作用在这两种模式中m的作用为假设不增加m则仅仅能在第一行进行匹配假设增加m则能够在全部的行进行匹配。我们再看一个^的样例var regx/^b./;var str“ret76 dfsdf bjfsdfs dffs b76dsf sdfsdf”;var rsstr.match(regx);此时rs的值为null假设增加grs的值仍然为null假设增加m则rs的值为{bj}也就是说在第一行没有找到匹配由于有參数m所以能够继续去以下的行去找是否有匹配假设m和g都加上则返回{bj,b7}仅仅加m不加g说明能够去多行进行匹配可是找到一个匹配后就返回增加g表明将多行中全部的匹配返回当然对于match方法是如此对于exec呢则须要运行多次才干依次返回总结3在HTML的textarea输入域中按一个Enter键相应的控制字符为“/r/n”即“回车换行”而不是“/n/r”即“换行回车”我们看一个前面我们举过的样例var regx/a/r/nbc/;var str“a bc”;var rsregx.exec(str);结果匹配成功rs的值为{ }假设表达式为/a/n/rbc/则不会被匹配因此在一般的编辑器中一个”Enter”键代表着“回车换行”而非“换行回车”至少在textarea域中是这种。转载于:https://www.cnblogs.com/mengfanrong/p/4318092.html