JavaScript正则表达式

来源:互联网 发布:手机网络劫持怎么办 编辑:程序博客网 时间:2024/06/05 08:50

目标

  1. 了解正则语法
  2. 在IDE中用正则替换、查找字符串
  3. 在javascript程序设计中,用正则表达式处理字符串

正则表达式

什么是正则表达式

RE(regular Expression) 用单个字符串匹配一系列符合某个句法规则的字符串。(按照某种规则匹配符合条件的字符串)

通配符

find ./ -name *.text

^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$
邮箱匹配正则表达式

http://regexper.com 图形化看正则表达式
可以在github下载项目安装到本地

\d 数字;
? 0-1次;
+ 1到多

eg:
1: \b is \b; \b 表示单词边界
2: http:(\/\/.+.jpg) \转义 .任意字符 ()分组
3: 2006/02/03 ^(\d{4})[/-](\d{1,2})[/-](\d{2})$

 "dfa2001-1-12fdafa2004-02-15dfda".match(/(\d{4})[/-](\d{1,2})[/-](\d{2})/g); //["2001-1-12", "2004-02-15"]

REGEXP对象

JS内置RegExp对象 支持正则表达式

实例化 RegExp对象
1 字面量 var reg = /\bis\b/g;(这样就是实例化了RegExp对象)
2 构造函数 var reg = new RegExp(‘\bis\b’, ‘gim’);//g 全局 i 忽略大小写 m 支持换行

eg 字面量

"THIS Is a book".replace(/is/gi,'is') "THis is a book""THIS Is a book".replace(/\bis\b/gi,'is') "THIS is a book"

eg 构造函数

var reg = new RegExp('\\bis\\b', 'g');"this is a map".replace(reg, 'Is')"this Is a map"

修饰符

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

元字符

正规有两种 基本字符类型组成:
1. 原义 文本 字符 abc is
2. 元字符 –> 在正则表达式中有特殊含义的非字母字符
. * + ? $ ^ | \ () [] {}

\t 水平制表符
\v垂直制表符
\n换行符
\r回车符
\0零字符
\f换页符
\cX 与X对应的控制字符(ctrl +X)

字符类

一般情况下,正则表达式一个字符对应字符串一个字符

eg: ab\t 匹配特定的一种

'adfaab '.match(/^\w+\t$/g);//["adfaab  "]

eg:[abc]匹配特定的一类

'a1b2c3d4'.replace(/[abc]/g, 'x');//"x1x2x3d4"

字符类取反

使用元字符^创建 反向类/负向类 (不属于某类的内容)
eg: 表达式 [^abc] 表示 不是字符a或b或c 的内容

'a1b2c3d4'.replace(/[^abc]/g, 'x');//"axbxcxxx"

范围类

使用字符类匹配数字 [0 1 2 3 4 5 6 7 8 9]
使用字符类匹配小写字母 [a-z]
使用字符类匹配大写字母 [A-Z]

'2014-12-13'.replace(/[0-9-]/g, 'x');//"xxxxxxxxxx"'a1b2d3x4z9'.replace(/[a-z0-9]/g, 'q');//"qqqqqqqqqq"

预定义类

. 等价 [^\r\n] 除了回车和换行符之外的所有字符
\d 等价 [0-9] 数字字符
\D 等价 [^0-9] 非数字字符
\s 等价 [\t\n\XOB\f\r] 空白符
\S 等价 [^\t\n\XOB\f\r] 非空白符
\w 等价 [a-zA-Z_0-9]单词字符(字母、数字、下划线)
\W 等价 [^a-zA-Z_0-9]非单词字符
大写表示取反

'fadfa1232131fdaf27648fdfs457vfgfd9gtr'.match(/\d/g);//["1", "2", "3", "2", "1", "3", "1", "2", "7", "6", "4", "8", "4", "5", "7", "9"]'fadfa1232131fdaf27648fdfs457vfgfd9gtr'.match(/\D/g);//["f", "a", "d", "f", "a", "f", "d", "a", "f", "f", "d", "f", "s", "v", "f", "g", "f", "d", "g", "t", "r"]

边界

正则还提供了几个常用的边界匹配字符
^ 以**开始 在[^]中取反
$ 以**结束
\b 单词边界
\B 非单词边界

'@789'.replace(/^@\d/gm,'x');//"x89"'@789'.replace(/^@\d{1,3}/gm,'x');//"x"'@789'.replace(/^@\d{1,3}?/gm,'x');//"x89"

量词

? 0-1 //{n,m}n到m次
+ 1 –> 多 //{n,} 至少n次
* 0 –>多 //{n,} 至少n次
{n}n次
{n,m}n到m次
{n,} 至少n次
{0,m} 至多m次

'@789fadfdaf'.replace(/^@\d{1,}?/gm,'x');//"x89fadfdaf"'@789fadfdaf'.replace(/^@\d{1,}/gm,'x');//"xfadfdaf"

贪婪模式

\d{3,6}'12345678'.replace(/\d{3,6}/g, 'x');"x78"//会先选择6个数字的来匹配'123456789'.replace(/\d{3,6}/g, 'x');"xx"//先6个数字匹配 后3个数字匹配

非贪婪模式

在量词后加上?即可

'12345678'.replace(/\d{3,6}?/g, 'x');"xx78"'123456789'.replace(/\d{3,6}?/g, 'x');"xxx"

分组

匹配字符串long连续出现3次的场景

 long{3}  这是g出现三次 (long){3}  //每个分组依次$1 $2 ....

忽略分组

不希望捕获某些分组,只需要在分组内加上 ?: 就可

(?:long).(ok) // ok ==> $1 

使用 | 可以达到或的效果

lo(ng|go)ng  =>  可以匹配longng  logong

反向引用

"2015-12-05".replace(/^(\d{4})\[^w](\d{2})\[^w](\d{2})$/g,$2+"/"+$1+"/"+$3); (有误 在"\["   在使用字符$时 需要转义\$  不然正则跟种默认规则在用)"abc123def".replace(/(\d{1})(\d{1})(\d{1})/,"($1)($2)($3)")//"abc(1)(2)(3)def""2015-02-15".replace(/^(\d{4})[^\w](\d{1,2})[^\w](\d{1,2})$/g,"$2/$1/$3");

前瞻/后顾(JavaScript不支持)

正则reg对象属性

属性 默认值
global (g) 只读 false
ignoreCase (i) 只读 false
multiline (m)只读 false
lastIndex 表达式匹配内容最后一个字符下一个位置
source 正则表达式文本字符串

var reg2 = /\w/gim;console.log(reg2.source); ⇒ '\w'

正则表达式方法

RegExp.xxx(str)

  • RegExp.prototype.test(str);返回true, false

    用于检测字符串参数中是否存在匹配正则表达式模式的字符串

    var reg1 = /\w/;    var reg2 = /\w/g;    while (reg2.test('ab')){        console.log(reg2.lastIndex);// 1 2     }
    (/w/g).test('a'); //每次实例化一个 RegExp 对象  (缺点增加内存开消)
  • RegExp.prototype.exec(str);

    使用正则表达式模式字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果

    如果没有匹配文本 则返回null,否则返回一个结果数组。
    -index 匹配文本第一个字符的位置。
    -input 存放检索的字符串 string

    非全局调用(调用非全局的RegExp对象exec()时 RegExp的lastIndex属性不生效)

str.xxx(reg)

  • String.prototype.match(reg)

    1 检索字符串,找到一个或多个与regexp匹配的文本
    2 regexp 有无标志g 影响结果。有g为全局调用
    非全局调用 match()只能在字符串中执行一次匹配,
    没有找到返回null,
    有返回一个数组 [index, input] 类似正则表达式 exce()

  • String.prototype.search(reg,str)

    字符串中查找子字符串
    1 查到,返回第一个匹配结果index. 没有查到,返回-1
    2 search()方法 不执行全局匹配,忽略标志g,并且 总是从字符串的开始进行检索。

  • String.prototype.replace(reg,str)

    从字符串中匹配到正则表达式规则的字符并替换成指定的字符串。

原创粉丝点击