JavaScript正则表达式

什么是正则表达式:

简单来说就是按照某种规则去匹配符合规则的字符串。

正则表达式学习工具

http://regexper.com (在线网站) 该网站将正则表达式形象的图解。
https://github.com/javallone/regexper-static regexper也可安装到本地。由github托管。

正则表达式的两种方法:
1.字面量
var b=/\bam\b/;//am 替换为AM
alert( “i am lily”.replace(b,’AM’)); //i AM lily
2.构造函数 RegExp
var reg=new RegExp(/\bis\b/);
alert(“she is beautiful”.replace(reg,”is not”)); // she is not beautiful

g:global 全文搜索,不添加则搜索到第一个匹配停止;
i:ignore case 忽略大小写,默认大小写敏感;
m:multiple lines 多行搜索

正则表达式由两种基本字符类型组成
1.原义文本字符:代表它原来含义的字符 例如:abc、123
2.元字符:在正则表达式中有特殊意义的非字母字符 例如:\b表示匹配单词边界,而非\b
在正则表达式中具体特殊含义的字符:* + ? $ ^ . \ () {} []

元字符:

\t:水平制表符;
\v:垂直制表符;
\n:换行符;
\r:回车符;
\0:空字符;
\f:换页符;

字符类

字符集合(Character Sets)
一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符’-‘指定一个范围。
例如,匹配”brisket”中的’b’和”chop”中的’c’。

反义字符:^。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 ‘-’ 指定一个范围内的字符。

例如,[^abc] 等价于 [^a-c]。 第一个匹配的是 “bacon” 中的’o’ 和 “chop” 中的 ‘h’。

范围类

[abcd] 等价于 [a-d]。其中-为范围。
如果想替换-和数字

'2016-1-3'.replace(/-[0-9]/g,'a')
"2016aa"

预定义类

正则表达式提供了 预定义类 匹配常见的字符类
. 等价于 [^\r\n] 表示除了回车符和换行符之外的所有的字符
\d 等价于 [0-9] 数字字符
\D 等价于 [^0-9] 非数字字符
\s 等价于 [\t\n\x0B\f\r] 空白符 s:space
\S 等价于 [^\t\n\x0B\f\r] 非空白符
\w 等价于 [a-zA-Z_0-9] 单词字符(字母、数字、下划线) w:word
\W 等价于 [^a-zA-Z_0-9] 非单词字符
提示:大写的表示取反

常见的边界匹配字符:
^ 以XXX开始
$ 以XXX结束
\b 单词边界
\B非单词边界

'a2b2a3'.replace(/a.$/g,'0');
"a2b20"
'a2b2a3'.replace(/^a./g,'0');
"0b2a3"

量词

- ? 出现<=1次
+ 出现>=1次
* 出现任意次
{n}出现n次
{n,m}出现n到m次,即最多m次
{n,}出现至少n次

如:将102替换为a
'222222222222'.replace(/2{10}/,'a');
"a22"

贪婪模式

尽量多的匹配。如下:尽量多匹配到出现5次的2

'222222222222'.replace(/2{2,5}/g,'a');
"aaa"

非贪婪模式

尽量少的匹配。在量词后加?

222222222222'.replace(/2{2,5}?/g,'a');
"aaaaaa"

分组

使用(),如:
byron重复3次:(byron){3}

替换字母+数字重复出现3次的元素为H
'a1b1j2dawds'.replace(/([a-z]\d){3}/g,'H')
"Hdawds"


使用|
反向引用
$1代表捕获的分组1

'2016-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')
"12/25/2016"

忽略分组
不希望捕获某分组,只需在分组内加上?:

(?:Byron)

前瞻

正则表达式从文本头部向尾部开始解析,文本尾部方向(即右方向),称为“前”
前瞻 就是在正则表达式匹配到规则的时候,向前检查是否符合断言。
断言是前瞻语法的一部分。
后顾/后瞻方向相反:比如找到儿子为张三,还得看看他的父亲(左侧字符串 后方向)是否是李四
符合特定断言称为 肯定/正向 匹配
不符合特定断言称为 否定/负向 匹配

语法:
正向前瞻 exp(?=assert) 先判断是否符合正则,再符合正则的基础上判断是否符合断言
例:
寻找单词字符(其前瞻为数字),替换为H

'a2*3a3'.replace(/\w(?=\d)/g,'H')
"H2*3H3"

负向前瞻 exp(?!asseret)
例:

'a2*3a3a_a'.replace(/\w(?!\d)/g,'H')
"aH*HaHHHH"

正向后顾,负向后顾:(js不支持)

js对象属性

教程地址:http://www.imooc.com/video/12537
test方法:返回值是 true 或 false。
RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式模式的字符串。
lastIndex 记录当前匹配结果的、最后一个字符的、下一个字符的位置
注意:test()方法在匹配的时候当匹配到一个结果时,会从lastIndex位置开始匹配下一个结果,直到不存在的时候才置为0。因此,当使用全局g属性标识时,当匹配到最后一个结果时,lastIndex值指向不存在的位置,此时再执行test()会返回false。
例子:多次执行test()方法,会在true、false之间循环
(/\w/g).test(‘a’)每次执行都是正确的,但是通过实例化对象,需要很大的开销
test()方法:原意就是测试有没有、能不能匹配上,当使用test原意时,没必要加g

exec()方法
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

字符串对象方法

search()方法
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

stringObject.search(regexp)

返回值:stringObject 中第一个与 regexp 相匹配的子串的起始位置
注释:如果没有找到任何匹配的子串,则返回 -1。
说明:
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。
match()方法
语法

stringObject.match(searchvalue)
stringObject.match(regexp)

说明
match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

var str="1 plus 2 equal 3"
document.write(str.match(/\d+/g))
输出:
1,2,3

注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

split方法:
语法:
stringObject.split(separator,howmany)

更多请参考String 对象方法
http://www.w3school.com.cn/jsref/jsref_obj_string.asp

关于用js的split()正则匹配分割的问题

在使用split()方法中,通过正则匹配的结果进行分割时,要特别注意有最后一个字符做为分割符的情况!
在IE下,分割的结果数组会忽略最后一个空数组;
在非IE下,会保留由最后一个分割符分割出来的空值!
所以这会造成在IE和非IE下数组长度差一个的结果!
用正则跟用字符串分割的区别实例:

var str="a|b|c|";
var arr=str.split(/\W+/);
alert("数组长度:"+arr.length+"\n数组内容:"+arr); //FF: 数组长度:4 数组内容:a,b,c,  IE:数组长度:3  数组内容:a,b,c
var arr=str.split("|");
alert("数组长度:"+arr.length+"\n数组内容:"+arr); //FF: 数组长度:4 数组内容:a,b,c,  IE:数组长度:4  数组内容:a,b,c,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值