正则表达式笔记2:正则表达式语法基础(JavaScript)

字符描述

元字符

元字符描述
.查找单个字符,除了换行和行结束符
\w查找单词字符
\W查找非单词字符
\d查找数字
\D查找非数字字符
\s查找空白字符
\S查找非空白字符
\b查找单词边界
\B查找非单词边界
\0查找NUL字符
\n查找换行符
\f查找换页符
\r查找回车符
\f查找制表符
\v查找垂直制表符
\xxx查找以八进制数XXX规定的字符
\xdd查找以十六进制数dd规定的字符
\uxxxx查找以十六进制数xxxx规定的Unicode字符
var r=/\x61/;
var s="javascript";
var a=s.match(r);
alert(a);//a
var r=/\s/;
var s="javascript Java";
var a=r.test(s);
alert(a);//true
var r=/\141/;//八进制
var s="javascript Java";
var a=s.match(r);
alert(a);//a
var r=/\u0061/;
var s="javascript Java";
var a=s.match(r);
alert(a);//a

字符范围

在正则表达式语法中,方括号表示用来查找特定范围内的字符,在方括号内仅指定起止字符,然后中间部分通过连字符(-)表示。如果方括号内添加脱字符(^)前缀,就表示定义除范围之外的字符。

  • [abc]:查找方括号之间的任何字符。
  • [^abc]:查找任何不在方括号之间的字符。
  • [0-9]:查找任何从0-9的数字,即查找任何数字。
  • [a-z]:查找任何从小写a到小写z字符,即查找任何小写字母。
  • [A-Z]:查找任何从大写A到大写Z字符,即查找任何大写字母。
  • [A-z]:查找任何从大写a到小写z字符,即查找任何形式字母。
  • [adgk]:查找给定集合内的任何字符。
  • [^adgk]:查找给定集合外的任何字符。

匹配任何ASCII字符

var r=/[\u0000-\u00ff\/g;

匹配任意双字节的汉字

var r=/[^\u0000-\u00ff\/g;

匹配任意大写字母

var r=/[\u0041-\u004A]/g;

匹配任意小写字母

var r=/[\u0061-\u007A]/g;

匹配任意大小写字母和数字

var r=/[a-zA-Z0-9]/g;

选择操作

使用竖线(|)描述,表示两个子模式的匹配结果中任选一个。

var s1="abc";
var s2="123";
var r=/\w+|\d+/;//选择重复字符类
var b1=r.test(s1);
var b2=r.test(s2);
alert(b1);//true
alert(b2);//true
var s1="abc";
var s2="123";
var s3="def";
var s4="456";
var r=/(abc)|(123)|(def)|(456)/;//选择重复字符类
var b1=r.test(s1);
var b2=r.test(s2);
var b3=r.test(s3);
var b4=r.test(s4);
alert(b1);//true
alert(b2);//true
alert(b3);//true
alert(b4);//true
var s="a'b?c&";
var r=/\'|\"|\?|\&/gi;//过滤敏感字符的正则表达式
function f(){
	return "&#"+arguments[0].charCodeAt(0)+";";
}
var a=s.replace(r,f);
document.write(a);//a'b?c&
alert(a);//a'b?c&

重复类量词

重复类量词列表

量词描述
n+匹配任何包含至少一个n的字符串
n*匹配任何包含零个或多个n的字符串
n?匹配任何包含零个或一个n的字符串
n{x}匹配包含x个n的序列的字符串
n{x,y}匹配包含x或y个n的序列的字符串
n{x,}匹配包含至少x个n的序列的字符串
var s="ggle gogle google gooogle gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go?gle/g;
var a=s.match(r);
alert(a);//ggle,gogle
var s="ggle gogle google gooogle gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go{0,1}gle/g;
var a=s.match(r);
alert(a);//ggle,gogle
var s="ggle gogle google gooogle gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go{3}gle/g;
var a=s.match(r);
alert(a);//gooogle,gooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/gooogle/g;
var a=s.match(r);
alert(a);//gooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go{3,5}gle/g;
var a=s.match(r);
alert(a);//gooogle,goooogle,gooooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go*gle/g;
var a=s.match(r);
alert(a);//ggle,gogle,google,gooogle,goooogle,gooooogle,goooooogle,gooooooogle,goooooooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go{0,}gle/g;
var a=s.match(r);
alert(a);//ggle,gogle,google,gooogle,goooogle,gooooogle,goooooogle,gooooooogle,goooooooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go+gle/g;
var a=s.match(r);
alert(a);//gogle,google,gooogle,goooogle,gooooogle,goooooogle,gooooooogle,goooooooogle
var s="ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
var r=/go{1,}gle/g;
var a=s.match(r);
alert(a);//gogle,google,gooogle,goooogle,gooooogle,goooooogle,gooooooogle,goooooooogle

惰性模式

重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。

  • ?、{n}和{n,m}重复类量词具有贪婪性,表现为贪婪的有限性。
  • *、+和{n,}重复类量词具有强贪婪性,表现为贪婪的无限性。

越是排在左侧的重复类量词匹配优先级越高。

var s="<html><head><title></title></head><body></body></html>";
var r=/(<.*>)(<.*>)/;
var a=s.match(r);
alert(a[1]);//<html><head><title></title></head><body></body>
alert(a[2]);//</html>

与贪婪匹配相反,惰性匹配在满足条件的前提下,尽可能少地匹配字符。
定义惰性匹配方法,在重复类量词后面添加英文问号(?)后缀。

var s="<html><head><title></title></head><body></body></html>";
var r=/<.*?>/;
var a=s.match(r);
alert(a);//<html>

6种重复类的惰性匹配简单描述:

  • {n,m}?:尽量匹配n次,但是为了满足限定条件也可能最多重复m次。
  • {n}?:尽量匹配n次。
  • {n,}?:尽量匹配n次,但是为了满足限定条件也可能匹配任意次。
  • ??:尽量匹配,但是为了满足限定条件也可能最多匹配1次,相当于{0,1}?。
  • +?:尽量匹配1次,但是为了满足限定条件也可能匹配任意次,相当于{1,}?。
  • *?:尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于{0,}?。
var s="<html><head><title></title></head><body></body></html>";
var r=/<.*>?/;
var a=s.match(r);
alert(a);//<html><head><title></title></head><body></body></html>

边界量词

边界就是确定匹配模式的位置,如字符串的头部和尾部。
JavaScript正则表达式支持的边界元字符

量词说明
^匹配开头,在多行检测中,会匹配一行的开头
$匹配结尾,在多行检测中,会匹配一行的结尾
var s="how are you";
var r=/(?:\w+)$/;
var a=s.match(r);
alert(a);//you
var s="how are you";
var r=/^(?:\w+)/;
var a=s.match(r);
alert(a);//how
var s="how are you";
var r=/(?:\w+)/g;
var a=s.match(r);
alert(a);//how,are,you

声明量词

声明量词包括正向声明和反向声明两种模式。

正向声明:声明表示条件的意思,是指定匹配模式后面的字符必须被匹配,但不返回匹配结果,正向声明使用“?=匹配条件”表示。

var s="a:123 b=345";
var r=/\w*(?==)/;
var a=s.match(r);
alert(a);//b

反向声明:指定接下来的字符都不必匹配。反向声明“(?!匹配条件”来表示。

var s="a:123 b=345";
var r=/\w*(?!=)/;
var a=s.match(r);
alert(a);//a

说明:声明虽然包含在小括号,但不是分组。JavaScript仅支持正向声明,而不支持反向声明。

表达式分组

使用小括号操作符可以对正则表达式字符串进行任意分组,在小括号内的字符串表示子表达式,或者称为子模式,子表达式具有独立的匹配功能,匹配结果也具有独立性。同时跟随在小括号后的量词将会作用于整个子表达式。
在正则表达式中,表达式分组具有极高的应用价值。

var s="javascript is not java";
var r=/java(script)?/g;
var a=s.match(r);
alert(a);//javascript,java
var s="ab=21,bc=45,cd=43";
var r=/(\w+)=(\d*)/;
var a=s.match(r);
alert(a);//ab=21,ab,21
var s="<h1>title<h1><p>text<p>";
var r=/(<\/?\w+>).*\1/g;
var a=s.match(r);
alert(a);//<h1>title<h1>,<p>text<p>
var s="<h1>title<h1><p>text<p>";
var r=/((<\/?\w+>).*\2)/g;
var a=s.match(r);
alert(a);//<h1>title<h1>,<p>text<p>
var s="<h1>title</h1><p>text</p>";
var r=/((<\/?\w+>).*\2)/g;
var a=s.match(r);
alert(a);//null
var s="<h1>title</h1><p>text</p>";
var r=/((<\/?\w+>).*((<\/?\w+>)))/g;
var a=s.match(r);
alert(a);//<h1>title</h1><p>text</p>

子表达式引用

在正则表达式执行匹配运算时,表达式计算会自动把每个分组(子表达式)匹配的文本临时存储起来备将来使用。这些存储在分组中的特殊值,被称为反向引用。反向引用将遵循从左到右的顺序,根据表达式中的左括号字符的顺序进行创建和编号。

var s="abcdefghijklmn";
var r=/(a(b(c)))/;
var a=s.match(r);
alert(a);//abc,abc,bc,c

反向引用在应用开发中主要包含以下几种常规用法。

var s="abcdefghijklmn";
var r=/(\w)(\w)(\w)/;
r.test(s);
alert(RegExp.$1);//a
alert(RegExp.$2);//b
alert(RegExp.$3);//c
var s="abcbcacba";
var r=/(\w)(\w)(\w)\2\3\1\3\2\1/;
var b=r.test(s);
alert(b);//true
var s="aa11bb22c3d4e5f6";
var r=/(\w+?)(\d+)/g;
var b=s.replace(r,"$2$1");
alert(b);//11aa22bb3c4d5e6f

说明:正则表达式分组会占用一定的系统资源,在较长的正则表达式中,存储反向引用会降低匹配速度。但是很多时候使用分组仅是为了设置操作单元,而不是为了引用,这时候如果选用一种非引用分组,就不会创建反向引用。

var s1="abc";
var s2="123";
var r=/(?:\w*?)|(?:\d*?)/;//非引用型分组
var a=r.test(s1);
var b=r.test(s2);
alert(a);//true
alert(b);//true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值