1 正则表达式语法
自己在学习正则表达式做的一些笔记
1.1限定符
限定符 | 用法 |
---|---|
* | 匹配前面的子表达式零次或多次,runoo*b,可以匹配runob、runooooob等,*代表前面的字符要出现0~n次 |
+ | 匹配前面的子表达式一次或多次 ,runoo+b,可以匹配runoob、runooooob等,+号代表前面的字符要出现1~n次 |
? | 例如"colou?r",可以匹配 color 或者 colour,,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1} |
{n} | n为非负整数。匹配确定的n次。例如’o{2}'不能匹配"Bob"的o,可以匹配"food"的两个o |
{n,} | 至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’ |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格 |
1.2普通字符
普通字符 | 用法 |
---|---|
[ABC] | 匹配[…]中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母 (i不算) |
[ ^ ABC] | 匹配[ ^ …]中的字符之外的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母 |
[A-Z] | 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母 |
. | 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [ ^\n\r] |
[\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
1.3例子
/[1-9][0-9]*/
//[1-9]设置第一个数字不是0,[0-9]*表示任意多个数字
匹配1~99的正整数表达式如下:
/[1-9][0-9]?/
/[1-9][0-9]{0,1}/
1.3.1贪婪
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
/<.*>/ 匹配从开始小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容。
<h1>www.gogo.com</h1>
//匹配到的是<h1>www.gogo.com</h1>
String reg="\\d{3,6}";
String test="61762828 176 2991 871";
System.out.println("文本:"+test);
System.out.println("贪婪模式:"+reg);
Pattern p1 =Pattern.compile(reg);
Matcher m1 = p1.matcher(test);
while(m1.find()){
System.out.println("匹配结 果:"+m1.group(0));
}
文本:61762828 176 2991 44 871
贪婪模式:\d{3,6}
匹配结果:617628
匹配结果:176
匹配结果:2991
匹配结果:871
多个贪婪在一起时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰,但如果不能满足时,会根据深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配。
String reg="(\\d{1,2})(\\d{3,4})";
String test="61762828 176 2991 87321";
System.out.println("文本:"+test);
System.out.println("贪婪模式:"+reg);
Pattern p1 =Pattern.compile(reg);
Matcher m1 = p1.matcher(test);
while(m1.find()){
System.out.println("匹配结果:"+m1.group(0));
}
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2})(\d{3,4})
匹配结果:617628
匹配结果:2991
匹配结果:87321
1.3.2 非贪婪
懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。
懒惰量词,是在贪婪量词后面加个“?”。
/<.*?>/如果您只需要匹配开始和结束 h1 标签,下面的非贪婪表达式只匹配 <h1>
<h1>www.gogo.com</h1>
//匹配到的是<h1>
1.4 定位符
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
**注意:*不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^ 之类的表达式。
1.5 选择
用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。
() 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。
但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用。
1.6 零宽断言
符号 | 用法 |
---|---|
?= | exp1(?=exp2):查找 exp2 前面的 exp1 |
?<= | (?<=exp2)exp1:查找 exp2 后面的 exp1 |
?! | exp1(?!exp2):查找后面不是 exp2 的 exp1 |
?<! | (?<!exp2)exp1:查找前面不是 exp2 的 exp1 |
1.7 反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配到了一个临时缓冲区中,所匹配的每个子匹配都按照在正则表达式中从左到右出现的顺序储存。缓冲区编号从1开始最多到99、每个缓冲区可以用 /n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。
//javascript
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));
捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。
单词边界元字符确保只检测整个单词。否则,诸如 “is issued” 或 “this is” 之类的词组将不能正确地被此表达式识别。
正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。
表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
#笔记出处
部分笔记来自于:
原作者姓名:假不理
原出处:掘金
链接:https://juejin.im/post/5b96a8e2
菜鸟教程:https://www.runoob.com/regexp/regexp-syntax.html