前言
由于经常被正则虐,看见就不知如何处理,已断断续续学习过一些,但是一段时间没有接触就连最基本的东西也忘了,原因就是不系统,也没有实战。现在把正则表达式整理一下,方便以后的学习和实践中掌握。
1. 什么是正则表达式
正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。
正则表达式是一个高效匹配检测的东西,对于表单检测,高亮显示搜索结果还是进行URL的地址映射,一般都需要用到它。
2. ReqExp
这一块是基于《javascript高级程序设计的第三版》整理部分。
ECMAScript是通过ReqExp类型来支持正则表达式
构造正则表达式的方法
- 以字面量的形式来定义(method1)
- 使用ReqExp构造函数(method2)
//pattern就是一个正则表达式。
//flags用于表达正则行为的标志。
//以字面量的形式来定义
var expression = /pattern/flags;
//构造函数
var expression = new ReqExp("pattern","flags");
flags标志 | 作用 |
---|---|
g | 全局模式,匹配将用于所有的字符串 |
i | 匹配不区分大小写 |
m | 多行模式 |
元字符
在正则表达式中有一些特殊的字符符号我们是不能直接使用的,必须对其进行转义后才能使用。如“\”,因为这些字符在正则表达式中有特殊的语法含义,这类字符被称为元字符,正则表达式中的元字符有:
([{\^$|)?*+.]}都属于元字符
如果要在正则表达式中直接匹配这些元字符,需要对它们转义。
- 由于是直接字面量,所以转义就ok了。(method1)
- 参数都是字符串,所以涉及到双重转义。(method2)
ReqExp的实例属性
说明 | |
---|---|
global | 表示是否设置了g标志,返回boolean值 |
ignoreCase | 表示是否设置了i标志,返回boolean值 |
lastIndex | 表示开始搜索下一个匹配项的字符位置,从0开始,返回的是整数。 |
multiline | 表示是否设置了m标志,返回boolean值 |
source | 以"字面量" 的形式返回正则表达式。 |
之前的这些属性其实用于不大,就当了解吧。
ReqExp实例方法---exec( )主力
exec(应用模式的字符串 ),返回包含第一个匹配项信息的数组,但是这个数组有两个额外的属性index
和input
。
- index 表示匹配项在字符串中的位置。
- input 表示应用正则表达式的字符串。
- 数组 第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。
注意:使用的exec()方法的时候设置和不设置g标志是有区别的。
设置g | 不设置g |
---|---|
每次调用exec( )都会在字符串中寻找新的匹配项 | 始终只是返回第一个匹配项的信息。 |
练练手
//eg1:
<script type="text/javascript">
var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern1.lastIndex);
//还有一组返回的也是一样的。
</script>
//eg2:
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern2.lastIndex);
var matches = pattern2.exec(text);
console.log(matches.index);
console.log(matches[0]);
console.log(pattern2.lastIndex);
很明显可以看到两者的差别。
IE的javascript实现在lastIndex属性上存在偏差,即使在非全局模式下,lastIndex属性每次也会变化。
test( 字符串)
- 模式与该参数匹配返回true
- 不匹配就返回false
基于此,test( )一般是用在if语句中的。
var text = "000-00-0000"
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
console.log("matched");
//很明显会在chorme的控制台console中输出matched
继承的方法
方法 | 返回 |
---|---|
toLocaleString( ) /toString() | 返回匹配正则表达式的字面量。 |
valueOf( ) | 返回正则表达式本身 |
//eg3:
var pattern = new RegExp("\\[bc\\]at","g");
console.log(pattern.toLocaleString());
console.log(pattern.toString());
console.log(pattern.valueOf());
以上就把正则在javascript中的大致整理了下,下面就主要整理正则表达式中的(pattern)写法以及常用元字符的功能。
3. 元字符整理
元字符(常用) | 说明 |
---|---|
. | 匹配除了换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d == [0-9] | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
元字符(重复) | 说明 |
---|---|
* | 重复0次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n, m} | 重复n到m次 |
//写一个正则可以匹配谷歌的三种网址
var gogle = "www.gogle.com";
var google = "www.google.com";
var gooogle = "www.gooogle.com";
var pattern = /w{3}\.go{1,3}gle\.com/i; ok
元字符() | 说明 |
---|---|
() | 分组 |
markdown制作表格的竖 | 表示分枝 |
[ ] | 表示选择里面的任意一个 |
(\d{1,3}\.){3}\d{1,3} 简单的ip匹配,但是大于255也可以匹配到;
改进:
((2[0-4])\d | 25[0-5] | [01]\d\d)\. ){3}(2[0-4])\d | 25[0-5] | [01]\d\d)
| 表示的分枝
元字符(反义) | 说明 |
---|---|
\W == [0-9A-Za-z_汉字] | 匹配任意不是字母,数字,下划线,汉子的字符 |
\S | 匹配任意不是空白符的字符 |
\D == [^0-9] | 匹配任意的非数字的字符 |
\B | 匹配不是单词开头或者结尾的位置 |
^x | 匹配除了x意外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母意外的任意字符 |
到此打住,关于后向引用,零宽断言,负向零宽断言,贪婪与懒惰先不整理。
参考
实战区域
会不定期的整理实战在这个部分。