Chinaunix首页 | 论坛 | 博客
  • 博客访问: 985912
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 694
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类
文章存档

2020年(45)

2019年(22)

我的朋友

分类: Java

2020-05-20 12:03:19

一、正则表达式创建

1.var reg = /test/;

2.var reg = new RegExp('test');

3.正则表达式的exec方法

var reg = /test/;

var str = 'testrjf';

var res = reg.exec(str);

//会匹配str里面test内容,有就返回匹配的该内容,没有返回null

console.log(res);//数组形式保存test

二、正则表达式模式

这里写一个方法方便后面演示

function execReg(reg,str){

var result = reg.exec(str);

  console.log(result);

}1.一片两片三四片,落尽正则全不见{n},{n-1,n},{1,}

reg = /c{1}/;//匹配一个c

str='cainiao';

execReg(reg,str);//返回c

reg = /c{2}/;//匹配两个连续的c,{n}同理

str1='ccaniao';

str2='cacniao';

execReg(reg,str1);//返回cc

execReg(reg,str2);//返回null,没有两个连续cc

reg = /c{3,4}/;//匹配3个或4连续的c

str1='cccTest';

str2='ccccTest';

execReg(reg,str1);//返回ccc

execReg(reg,str2);//返回cccc(正则会尽量多的匹配)

reg = /c{1,}/;//匹配1个以上的c{2,}{3,}...同理

str1='cccTest';

str2='chjjk';

execReg(reg,str1);//返回ccc

execReg(reg,str2);//返回c

reg='/c*/和等同于reg='/c{0,}/

reg='/c+/和等同于reg='/c{1,}/

reg='/c?/和等同于reg='/c{0,1}/

这里在提示一下,正则表达式会尽可能匹配多的目标返回,有4个就不会返回3

2./^开头,结尾$/

^开头

reg = /^c/;//^表示只匹配字符串的开头

str1='维生素c';

str2='cainiao';

execReg(reg,str1);//结果为null,因为字符串‘外汇分析师’的开头并不是c

execReg(reg,str2);//这次则返回c

结尾$

reg = /c$/;//$匹配字符串结尾的字符

str1='cainiao';

str2='维生素c';

execReg(reg,str1);//返回null

execReg(reg,str2);//返回c

3.点“.

reg = /./;//'.'会匹配字符串中除了换行符\n之外的所有字符

str1='cainiao';

str2='bainiao';

execReg(reg,str1);//正则匹配到了字符c

execReg(reg,str2);//正则匹配到了字符b

reg = /.+/;

str1='blueidea—经典论坛  好_';

str2='bbs.blueidea.com';

str3='\ncainiao';

execReg(reg,str1);

//返回'blueidea—经典论坛  好_'所有的字符都被匹配到了

execReg(reg,str2);//返回'bbs.blueidea.com'

execReg(reg,str3);//返回null

4.或“|

reg = /b|c/;

str1='blueidea';

str2='cainiao';

execReg(reg,str1);//返回b

execReg(reg,str2);//返回c

reg = /^b|c.+/;

str='cainiao';

execReg(reg,str);//返回cainiao,理解成开头b|c然后.+

reg = /^b|c.+/;

str='bbs.blueidea.com';

execReg(reg,str);//返回b,这里看成开头的b或者是c.+

5.括号

reg = /^(b|c).+/;

str='bbs.blueidea.com';

execReg(reg,str);//此时才是开头b|c,然后.+

//回的结果后面多出来一个“,b“,这是()内的b|c所匹配的内容。

//我们在正则表达式内括号里写的内容会被认为是子正则表达式,所匹配的结果也会被记录下来供后面使用。我们暂且不去理会这个特性。

6.字符集合[abc]

reg = /^[abc]/;//[abc]表示a或者b或者c中的任意一个字符

str='bbs.blueidea.com';

execReg(reg,str);//返回b

reg = /^[a-zA-Z][a-zA-Z0-9_]+/;//^[a-zA-Z],后[a-zA-Z0-9_]+

str='test';

execReg(reg,str);//返回test

7.反字符集合[^abc]

reg = /[^abc]/;

str='blueidea';

execReg(reg,str);//返回l(即第一个b没有匹配)

即:[^0-9] 表示非数字,[^a-z] 表示非小写字母…

 

8.边界与非边界

\b表示的边界的意思

reg = /\bc/;//表示字符串开始的c或者是结尾的c

str1='cainiao';

str2='维生素c';

execReg(reg,str1);//返回c,左边界的c

execReg(reg,str2);//返回c,右边界的c

\B表示非边界

reg = /\Bc/;//表示字符串除了开始(结尾)的c

str='aicniao';

execReg(reg,str);//返回c,中间的c

9.数字与非数字

\d表示数字的意思

reg = /\d/;

str='cainiao8';

execReg(reg,str);//返回8

\D表示非数字的意思

reg = /\d/;

str='cainiao8';

execReg(reg,str);//返回c

10.空白

\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。

\s匹配单个空格,等同于[\f\n\r\t\v]

reg = /\s.+/;

str='This is a test  String.';

execReg(reg,str);//返回'is a test String.',匹配第一个空格以及其后的所有非换行字符。

\S表示非空格字符。

reg = /\S+/;

str='This is a test  String.';

execReg(reg,str);//This,当遇到第一个空格之后,正则就停止匹配

11.单词字符

\w表示单词字符,等同于字符集合[a-zA-Z0-9_]

reg = /\w+/;

str='.blueidea';

execReg(reg,str);//blueidea

\W表示非单词字符,等效于[^a-zA-Z0-9_]

reg = /\W+/;

str='中文如何?';

execReg(reg,str);//'中文如何?'

12.反向引用

reg = /(\w)\1/;

str1='blueidea';

str2='bblueidea';

execReg(reg,str1);//返回null

execReg(reg,str2);//bb

//这里的“\1”就叫做反向引用,它表示的是第一个括号内的字正则表达式匹配的内容。

//在上面的例子中,第一个括号(\w)匹配了b,“\1”就同样表示b了,在余下的字符串里自然找不到b了。

13.不记录子正则表达式的匹配结果

使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果

reg = /^(?:b|c).+/;

str='bbs.blueidea.com';

execReg(reg,str);//返回bbs.blueidea.com

//前面提到的括号里子表达式不被保存

14.正向预查

形式:(?=pattern),即要匹配的字符串,后面必须紧跟着pattern

reg = /cainiao(?=8)/;//只是后面必须跟着8,但结果不匹配8

str1='cainiao9';

str2='cainiao8';

execReg(reg,str1);//返回null

execReg(reg,str2);//返回cainiao

形式:(?!pattern)?=恰好相反,要求字符串的后面不能紧跟着某个pattern

reg = /cainiao(?!8)/;

str1='cainiao9';

str2='cainiao8';

execReg(reg,str1);//返回cainiao

execReg(reg,str2);//返回null

15.匹配元字符

*,+,?之类的符号,它们在正则表达式中都有一定的特殊含义,类似这些有特殊功能的字符都叫做元字符。那我们想匹配’c?'这种字符串呢?

reg = /c\?/;

str='c?';

execReg(reg,str);//返回'c?'

三、正则表达式修饰符

1.i: 执行对大小写不敏感的匹配。

var reg = /b/;

var str = 'BBS';

execReg(reg,str);//返回null

var reg = /b/i;

var str = 'BBS';

execReg(reg,str);//B

2.g: 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)

在后面进行讲解

3.m: 执行多行匹配。

reg = /^b/;

str = 'test\nbbs';//有换行

execReg(reg,str);//null

reg = /^b/m;

str = 'test\nbbs';

execReg(reg,str);//返回b,换行后第二行b开头

四、正则表达式方法

1.exec方法

exec方法返回的其实并不是匹配结果字符串,而是一个对象,简单地修改一下execReg函数,来做一个实验就可以印证这一点。

function  execReg(reg,str){

var result =  reg.exec(str);

console.log(typeof result);

reg = /b/;

str='bbs.bblueidea.com';

execReg(reg,str);

//显示result的类型是object。而且是一个类似数组的对象。

其中属性:index input 0。其中index是表示匹配在原字符串中的索引;而input则是表示输入的字符串;至于0则是表示只有一个匹配结果,可以用下标0来引用这个匹配结果,这个数量可能改变。我们可以通过返回值的length属性来得知匹配结果的总数量。

然后修改execReg函数

function  execReg(reg,str){

var result =  reg.exec(str);

console.log('index:'+result.index+'\n'+'input:'+result.input+'\n');

for(i=0;i

console.log('result['+i+']:'+result[i]+'\n');

reg  = /\w/;

str='bbs.bblueidea.com';

execReg(reg,str);

阅读(4803) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~