RegExp 对象用于规定在文本中检索的内容。
简单的模式可以是一个单独的字符。
更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。
定义量
var pattern=/a$/; //第一种
var patterns=new RegExp("a$"); //第二种
修饰符
i:不区分大小写
g:global,全局
gi:不区分大小写的全局
m:多行的不知道跟全局有什么区别
var att="My name is mian mian";
var pattern=/an/g; //global,全局
document.write(att.match(pattern)); //an,an
表达式
[abc]
查找方括号之间的任何字符。
[^abc]
查找任何不在方括号之间的字符。
[0-9]
查找任何从 0 至 9 的数字。
[a-z]
查找任何从小写 a 到小写 z 的字符。
[A-Z]
查找任何从大写 A 到大写 Z 的字符。
[A-z]
查找任何从大写 A 到小写 z 的字符。
[adgk]
查找给定集合内的任何字符。
[^adgk]
查找给定集合外的任何字符。
red|blue
查找任何指定的选项。
var att="Mynameismianmianred";
var pattern=/is|an/g;
document.write(att.match(pattern)); //is,an,an
元字符
[.]
查找单个字符,除了换行和行结束符。
多少个点就是后面还有多少个字符
var att="Mynameismianmianred";
var pattern=/is./g;
document.write(att.match(pattern));
[\w]
查找单词字符。
[\W]
查找非单词字符。
\b
单词的边界
使用单词的边界来代替真正的空格符进行匹配,可以避免如
var att=/\slanguage\s/;
m="javascript is a 'good' language";
document.write(m.match(att)); //null
明明是有的,却像找不到一样
var att=/\blanguage\b/;
m="javascript is a 'good' language";
document.write(m.match(att)); //language
\B
非单词边界,将把匹配的锚点定位在不是单词的边界之处,
var att=/\Blanguage\B/;
ar patt=/\Bscrip\B/;
m="javascript is a 'good' language";
document.write(m.match(att)); //null
document.write(m.match(patt)) //scrip;
[\d]
查找数字。
[\D]
查找非数字字符。
[\s]
查找空白字符。
[\S]
查找非空白字符。
注意:在方括号内也可以写这些特殊转义符,但是跟不用方括号的时候有一点点小小的区别,例如:
var att="My name is 444n";
var pattern=/[\d\S]/g;
document.write(att.match(pattern));
//M,y,n,a,m,e,i,s,4,4,4,n
不用方括号
var att="My name is 444n";
var pattern=/\d\S/g;
document.write(att.match(pattern)); //44,4n
直接的话意思就会成为是说一个数字一个非Unicode空白字符的字符,因而需要加上一个或的符号’|'
var att="My name is 444n";
var pattern=/\d|\S/g;
document.write(att.match(pattern));
//M,y,n,a,m,e,i,s,4,4,4,n
另外,转义符\b
具有特殊含义,当用在字符类中的时候,它表示的是退格符,所以要在正则表达式中按照直接量表示一个退格符只需要使用一个元素的字符类/[\b]/
,而如果直接写做/\b/
就会表达为匹配单词界。如:
var att="My name is 444n\b";
var pattern=/\b/g;
document.write(att.match(pattern));//,,,,,,,
var pattern=/[\b]/g;
document.write(att.match(pattern));//输出空白而不是null
重复字符语法
[n+]
匹配任何包含至少一个n 的字符串。
var str="you are a good boy!";
var patt1=/o+/g;
document.write(str.match(patt1)); //o,oo,o
查找单词:
var pattern=/\w+/g; //匹配至少一个单词字符,而空格不算进内,所以就是分单词了
document.write(att.match(pattern)); //My,name,is,444n
[n*]
匹配任何包含零个或多个 n 的字符串。
var patt1=/o*/g;
document.write(str.match(patt1));
//,o,,,,,,,,,,oo,,,,o,,, //输出结果把其他的都忽略掉
另外,对 "l" 进行全局搜索,包括其后紧跟的一个或多个 "o",这样也可以查询一些其他的比如1开头,其后有一个或多个0的数据:
var att="lolololllll\b";
var pattern=/lo*/g;
document.write(att.match(pattern)); //lo,lo,lo,l,l,l,l,l
然而需要注意的是,这些字符可能匹配0个字符,因此可能什么都不匹配。
var att="My name is xiaomian";
var pattern=/\z*/g;
if(att.match(pattern))
document.write("true"); //att中未出现z,然而还是匹配成功
[n?]
匹配任何包含零个或一个 n 的字符串,使用方法与[n*]有点类似。
[n{X}]
匹配包含 X 个 n 的序列的字符串。
var att="wo shi 小小娩 ";
var pattern=/\S{3}/g;
document.write(att.match(pattern)); //shi,小小娩
var pattern=/\小{2}./g;
document.write(att.match(pattern)); //小小娩
[n{X,Y}]
匹配包含 X 或 Y 个 n 的序列的字符串。只是一个或的关系,其他的没什么区别吧
[n{X,}]
匹配包含至少 X 个 n 的序列的字符串。
var att="we are the best!";
var pattern=/\S{2,}/g;
document.write(att.match(pattern)); //we,are,the,best!
[n$]
匹配任何结尾为 n 的字符串。
var att="we are the best!";
var pattern=/....!$/g;
document.write(att.match(pattern)); //best!
[^n]
匹配任何开头为 n 的字符串,与[n$]
类似。
[?=n]
匹配任何其后紧接指定字符串 n 的字符串。
var att="我是小娩";
var pattern=/是(?=小)../g;
document.write(att.match(pattern)); //是小娩
[?!n]
匹配任何其后没有紧接指定字符串 n 的字符串。与[?=n]类似
圆括号的作用
- 把单独的项合成子表达式,以便可以像处理一个独立的单元那样使用
|
、‘、*
等来对单元内的项来进行处理。例如:
var att="javascript and java";
var pattern=/java(script)?/g;
console.log(att.match(pattern)); //["javascript", "java"] - 在完整模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式想匹配的部分
- 允许在同一正则表达式的后部引用前面的子表达式。
这是通过在字符"\"
后加一位或多位数字来实现的。这个数字指定了带圆括号的子表达式在正则表达式中的位置。如:
\1引用的是第一个带圆括号的子表达式,\3引用的是第三个带圆括号的子表达式。例如:
var att=/(java(script)?)\sis\s/ ;
中(script)就可以用\2来指代
用于模式匹配的String方法
search()
:它的参数是一个正则表达式,返回第一个与之匹配的字串的起始位置,如果找不到匹配的字串,则会返回-1;
var patt=/\Bscrip\B/;
m="javascript is a 'good' language";
document.write(m.search(patt)); //4
search()不支持全局检索,在检查到第一个后就马上返回了。
replace()
:用来检索和替换操作。第一个参数是正则表达式,第二个参数是要进行替换的字符串
如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
var str="Visit Microsoft and Microsoft welcome you!"
document.write(str.replace(/Microsoft/g,"W3S"));
//Visit W3S and W3S welcome you!
$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$`: 位于匹配子串左侧的文本。
$': 位于匹配子串右侧的文本。
$$:直接量符号。
name = "Doe, John";
document.write(name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1")); //John Doe
match()
:它的唯一参数就是一个正则表达式,返回一个由匹配结果组成的数组。
split()
方法,使用跟字符串的分割有点类似。
RegExp方法
test()
:如果包含匹配结果则返回true
exec()
:对一个指定的字符串执行一个正则表达式,返回一个数组,并提供关于本次匹配的完整信息,当具有g时,它将当前正则表达式对象的lastIndex属性设置为所指示的字符串开始检索,每次查找之前都要设置为0;