1.正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换
什么是正则表达式?
正则表达式是由一个字符序列形成的搜索模式。
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作。
语法
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。
实例:
var patt = /runoob/i
实例解析:
/runoob/i 是一个正则表达式。
runoob 是一个正则表达式主体 (用于检索)。
i 是一个修饰符 (搜索不区分大小写)。
使用字符串方法
在Javascript中,正则表达式通常有两个字符串方法:replace()和seach()
search()方法 用于检索字符串中指定的字符串,或检索与正则表达式相匹配的子字符串,返回子串的起始位置
replace()方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
search() 方法使用正则表达式
实例
使用正则表达式搜索 “Runoob” 字符串,且不区分大小写:var str = "Visit Runoob!";
var n = str.search(/Runoob/i);
输出结果为:
6
search() 方法使用字符串
search 方法可使用字符串作为参数。字符串参数会转换为正则表达式:
实例
检索字符串中 “Runoob” 的子串:var str = "Visit Runoob!";
var n = str.search("Runoob");
replace() 方法使用正则表达式
实例
使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :
<body>
<p>替换 "microsoft" 为 "Runoob" :</p>
<button onclick="myFunction()">点我</button>
<p id="demo">Visit Microsoft!</p>
<script>
function myFunction() {
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/microsoft/i,"Runoob");
document.getElementById("demo").innerHTML = txt;
}
</script>
</body>
replace() 方法使用字符串
replace() 方法将接收字符串作为参数:var txt = str.replace("Microsoft","Runoob");
正则表达式模式
完整原文链接:http://c.biancheng.net/view/5632.html
正则表达式的语法体现在字符模式上。字符模式是一组特殊格式的字符串,它由一系列特殊字符和普通字符构成,其中每个特殊字符都包含一定的语义和功能。
描述字符
根据正则表达式语法规则,大部分字符仅能够描述自身,这些字符被称为普通字符,如所有的字母、数字等。
元字符就是拥有特动功能的特殊字符,大部分需要加反斜杠进行标识,以便于普通字符进行区别,而少数元字符,需要加反斜杠,以便转译为普通字符使用。JavaScript 正则表达式支持的元字符如表所示。
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符 |
\w | 查找单词字符 |
\W | 查找非单词字符 |
\d | 查找数字 |
\D | 查找非数字字符 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\0 | 查找 NUL字符 |
\n | 查找换行符 |
\f | 查找换页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\xxx | 查找以八进制数 xxxx 规定的字符 |
\xdd | 查找以十六进制数 dd 规定的字符 |
\uxxxx | 查找以十六进制 xxxx规定的 Unicode 字符 |
表示字符的方法有多种,除了可以直接使用字符本身外,还可以使用 ASCII 编码或者 Unicode 编码来表示。
描述字符范围
在正则表达式语法中,放括号表示字符范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如:
- [abc]:查找方括号内任意一个字符。
- [^abc]:查找不在方括号内的字符。
- [0-9]:查找从 0 至 9 范围内的数字,即查找数字。
- [a-z]:查找从小写 a 到小写 z 范围内的字符,即查找小写字母。
- [A-Z]:查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。
- [A-z]:查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。
量词:
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
2.使用正则表达式对象RegExp
定义正则表达式
定义正则表达式的方法有两种:构造正则表达式和正则表达式(字面量)。
1.使用RegExp构造函数可以定义正则表达式对象。其语法格式如下:newRegExp(pattern,atributes)
参数pattern是一个字符串,指定匹配模式或者正则表达式对象;参数attributes是一个可选的修饰性标志,包含”g””i””m”,分别设置全局匹配,区分大小写的匹配,和多行匹配。如果参数pattern是正则表达式对象,则省略该参数。该参数将返回一个新的RegExp对象,对象包含指定的匹配模式和匹配标志。
2.正则表达式直接量使用双斜杠作为分隔符进行定义,双斜杠之间包含的字符为正则表达式的字符模式,字符模式不能使用引号,标志字符放在最后一个斜杠的后面。其语法格式如下:/pattern/attributes
实例设计
//示例1,下面的示例使用RegExp构造函数定义了一个简单的正则表达式。
//匹配模式为字符“a”,没有设置第二个参数,所以这个正则表达式只能够匹配字符串中的第一个小写字母a.后面的字母a将无法匹配到。
var r = new RegExp("a"); //构造最简单的正则表达式
var s = "JavaScript!=JAVA"; //定义字符串直接量
var a = s.match(r); //调用正则表达式执行匹配操作,返回匹配的数组
console.log(a); //返回数组["a"]
console.log(a.index); //返回值为1,匹配的下标位置
使用不同模式和标记可以创建各种正则表达式,比如
let pattern1=/at/g;//匹配字符串中的所有“at”
let pattern2=/.at/i;//匹配所有以“at”结尾的三字符组合,忽略大小写
let pattern3=/[bc]at/i;//匹配第一个“bat”“cat”,忽略大小写
JavaScript正则表达式支持”g””i””m”3个标志修饰符,简单说明如下。
“g” global(全局)的缩写,定义全局匹配,即正则表达式将在指定字符串范围内执行所有匹
配,而不是找到第1个匹配结果后就停止匹配。
“i”:case -insensitive-大小写不敏感)中 insensitive的缩写,定义不区分大小写匹配,即对于字
母的大小写视为等同。
m”: multiline(多行)的缩写,定义多行字符串匹配。
这3个修饰词分别指定了匹配操作的范围、大小写和多行行为,关键词可以自由组合。
元字符的转义
与其他语言的正则表达式一样,所有的元字符在模式中也必须转义,包括:{ [ ( \ ^ $ | ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面的字符本身,就必须使用反斜杠来转义。下面是几个例子:
let s = "There is a bat and cat, 'batand.atcat[bc]at'"
let pattern1 = /[bc]at/i; //匹配第一个“bat”或者“cat”,忽略大小写
let pattern2 = /\[bc\]at/i; //匹配第一个“[bc]at".忽略大小写
let pattern3 = /.at/gi; //匹配第一个以“at”结尾的三字符组合,忽略大小写
let pattern4 = /\.at/gi; //匹配第一个“.at”,忽略大小写
let a = pattern1.exec(s);
let b = s.match(pattern2);
const c = pattern3.exec(s);
let d = pattern4.exec(s);
console.log(a);
console.log(b);
console.log(c);
console.log(d);
这里的 pattern1匹配”bat”或”cat”,不区分大小写。要直接匹配[bc]at,左右中括号都必须像 pattern2中那样使用反斜杠转义。在 pattern3中,点号表示”at”前面的任意字符都可以匹配,如果想匹配at,那么要像 pattern4中那样对点号进行转义。
前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用 RegExp构造函数来
创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可
以通过构造函数来创建,比如:
匹配第一个”bat”或”cat”,忽略大小写let pattern1 =/[bc]at/i;
/跟 patternl1一样,只不过是用构造函数创建的let pattern2 new RegExp('[bc]at','i');
这里的 pattern1和 pattern2是等效的正则表达式。注意, RegExp构造函数的两个参数都是字符串。因为 RegExp的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符序列,如\n(\转义后的字符串是\,在正则表达式字符串中则要写成\\)下表展示了几个正则表达式的字面量形式,以及使用 RegExp构造函数创建时对应的模式字符串。
字面量模式 | 对应的字符串 |
---|---|
/\[bc]at/ | “\\[bc\\]at” |
/\.at/ | “\. at” |
/name\/age/ | “name\ \/age” |
/\d.\d(1,2}/ | “\\d.\\d(1,2}” |
/\w\\hello\\123/ | “\\w\\\\hello\\\\123” |
编译正则表达式
实例设计
var s = "JavaScript";
var r = /\w/g;
while (r.test(s)) {
if (r.lastIndex == 3) {
r.compile(/[A-Z]/g);
r.lastIndex = 3;
}
console.log('匹配模式是' + r + ' 匹配文本是' + RegExp.lastMatch + ' r.lastIndex= ' + r.lastIndex);
}
RexExp静态属性
实例设计:
var s = "JavaScript css html";
var r = /(Java)Script/g;
var n = r.exec(s);
console.log(RegExp.input);
console.log(RegExp.$_);
console.log(RegExp.lastParen);
console.log(RegExp.rightContext);
补充