正则表达式的创建:
有两种创建正则表达式的方式:
方法1、 构造函数:var reg=new RegExp("正则表达式","修饰符"); reg--regular:规则 exp--expression:表达
方法2、 var reg=/正则表达式/修饰符;(常用方法) pattern:典范、模式 modifiers:修饰语
第二种方法是最常见的,有时候我们需要动态创建正则,我们可以用eval函数来动态的创建正则,例如:
// 下面的意识是 匹配以ab开头后面出现0次或多次c的 字符 (全局多次匹配 如果没有g 就匹配一次) var patter = 'c*'; var reg =eval(`/ab${patter}/g`);//等同于 reg =/abc*/g` var str = "abccccabccabdc"; console.log(str.match(reg));//["abcccc", "abcc", "ab"] console.log(reg.test(str));//true
正则表达式的方法:
1、检测方法
reg.test(String) 和 reg.exec(String) 都可以检测 字符串是否符合 正则表达式 前者返回布尔值,后者返回数组(不匹配则返回null)
string类中支持正则的方法:
2、search方法:用来检索字符串中 符合正则的 字符串,返回索引,不存在 则返回 -1
语法:str.search(reg)
3、match方法:返回 匹配正则的 字符串组成的 数组 没有则返回null
语法:str.match(reg)
4、replace方法:用来用新的字符串 去替换 正则 匹配到的 字符串,返回替换过的字符串
语法:str.replace(reg,newStr)
数量词 — * + ? and{}
abc* 匹配ab后有零个或多个为c的字符串 abc+ 匹配ab后有一个或多个为c的字符串 abc? 匹配ab后有零个或一个为c的字符串 abc{2} 匹配ab后有2个 c的字符串 abc{2,} 匹配ab后有2个 c或更多个c的字符串 abc{2,5} 匹配ab后跟2到5个c的字符串 a(bc)* 匹配a后面跟零个或多个重复的bc序列的字符串 a(bc){2,5} 匹配a后面跟2个到5个重复的bc序列的字符串 或运算符——|或[] a(b|c) 匹配a后跟b或c的字符串 a[bc]
字符类— \d \w \s和.
// 常用的元字符(特殊字符) // \w :匹配数字、字母,下划线 等价于[a-zA-Z0-9] // \W :匹配非数字、字母、下划线 等价于[^a-zA-Z0-9] // \d :匹配数字 // \D :匹配非数字 // \s :匹配空白字符(空格、换行) // \S :匹配非空白字符 // \n :匹配换行符
// . :匹配任何字符
为了按字面意思理解,你必须使用反斜杠“\”来转义字符^.[$()|*+?{\,因为它们具有特殊含义。
\$\d
匹配一个数字前面有一个$的字符串
请注意,您还可以匹配不可打印的字符,如制表符\ t,换行符\ n,回车符\ r。
标志位:
// i :执行对大小写不敏感的匹配 // g :执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) // m :执行多行匹配
分组和捕获— ()
a(bc)
括号创建一个值为bc的捕获组
a(?:bc)*
我们使用?:禁用捕获组
a(?
我们使用?
当我们需要使用您首选的编程语言从字符串或数据中提取信息时,此运算符非常有用。由几个组捕获的任何多次出现都将以经典数组的形式公开:我们将使用匹配结果的索引来访问它们的值。
如果我们选择为组添加名称(使用(?
括号表达式— []
[abc]
匹配一个具有a或b或c的字符串 - >与a | b | c相同
[a-c]
同上一情况
[a-fA-F0-9]
表示一个十六进制数字的字符串,不区分大小写
[0-9]%
在%符号之前具有0到9之间字符的字符串
[^a-zA-Z]
一个没有字母从A到Z或从A到Z.的字符串,在这种情况下,^被用作表达式的否定
请记住,在括号内的表达式中,所有特殊字符(包括反斜杠\)都会失去其特殊权力:因此我们不会应用“转义规则”。
贪婪与惰性匹配;
量词(* + {} )是贪婪的运算符,因此它们通过提供的文本尽可能地扩展匹配。
例如,<.+>匹配This is a
为了只捕获div标签,我们可以使用? 让它变得懒惰:
<.+?>
匹配<和>内包含的任何一个或多个字符,根据需要进行扩展
请注意,更好的解决方案应该避免使用.来支持更严格的正则表达式:
<[^<>]+>
匹配<和>中包含的一次或多次除<或>以外的任何字符 (匹配到 高级主题: 边界— \b and \B \babc\b 执行“仅限整个单词”搜索 \b表示像插入符号(它类似于$和^)的匹配位置,其中一侧是单词字符(如\w)而另一侧不是单词字符(例如,它可能是字符串的开头或者空格字符)。 它伴随着它的否定,\B。这匹配\b不匹配的所有位置,如果我们想要找到完全被单词字符包围的搜索模式,则可以匹配。 \Babc\B 仅当图案完全被单词字符包围时才匹配 回溯引用— \1 ([abc])\1 使用\1,它与第一个捕获组匹配的相同文本匹配 ([abc])([de])\2\1 我们可以使用\ 2(\ 3,\ 4等)来识别与第二个(第三个,第四个等)捕获组匹配的相同文本 (? 我们把这个组命名为foo,稍后我们引用它(\ k 先行和后行断言— (?=)和(?<=) d(?=r) 仅在r之后匹配d,但r将不是整体正则表达式匹配的一部分 (?<=r)d 仅在r之前匹配d,但r将不是整体正则表达式匹配的一部分 你也可以使用否定运算符! d(?!r) 仅在不跟随r的情况下匹配d,但r将不是整体正则表达式匹配的一部分 (? 仅在没有r之前匹配d,但r将不是整体正则表达式匹配的一部分 后面的高级主体有点晦涩难懂,后面多练习吧 。