j s正则表达式

j s正则表达式
j s正则表达式

正则

正则:一个规则,它是用来处理字符串的,验证字符串是否符合某个规则(正则匹配),或者是把字符串中符合规则的内容取出来(正则捕获)

一个正则是由元字符组成的。

创建正则有两种方式(有一些区别)

var reg1=/\d/;//字面量方式,代表包含0-9之间的任意一个数字即可var reg2=new RegExp("\\d");//实例创建方式

区别在于:

1.实例创建方式需要多转译一次,把具有特殊意思,并且带\的都要多转译一次。

2.字面量方式无法识别变量,而实例创建方式可以,也就是说实例创建可以进行我们的字符串拼接(把一个变量代表的值放到正则中作为规则)。

var reg1=/\d/;

var reg2=new RegExp("\\d");

varreg=/zhufeng/;

console.log(reg.test("welcome zhufeng student"));//true

console.log(reg.test("welcome zhufeng student"));//false

var c="w100";

varreg=/^"+c+"$/;//以"开头,出现一到多次,然后是c出现一到多次,最后以"结尾,而不是我们认为的字符串拼接

varreg=new RegExp("^"+c+"$");//此时只能包含w100的

正则中还包含修饰符:i(ignoreCase忽略大小写), m(multiline 匹配换行), g(global 全局匹配)

varreg=/^[a-z]$/i;

varreg=new RegExp("^[a-z]$","i");

console.log(reg.test("Z"));

具有特殊意义的元字符

\d :0-9之间任意一个数字

\ :转译字符

^ :以某一个元字符开始

$ :以某一个元字符结束

\n :一个换行符

. :匹配除了\n以为的任何字符

x|y :x或者y

[xyz] :x y z 三个中一个

[^xyz] :除三个中的任一个

[a-z] :a--z之间任意一个

[^a-z] :除了a--z之间任意一个

\w :数字、字母、下划线[a-zA-z_0-9]

\b :匹配一个边界

\s :匹配任何的空白字符空格制表符换页符

量词元字符(代表出现多少次)

* :出现零到多次

+ :出现一到多次

?:出现零或一次

{n} :出现n次

{n,} :出现n到多次

{n,m} :出现n到m次

普通元字符:所有的东西都可以作为我们的元字符,除了特殊的以外,都代表本身的意思

正则中有一个方法,

test 匹配字符串(验证某个字符串是否符合正则的规则的),返回true代表匹配返回false代表不匹配。

例1:

varreg=/\d/;

var str1="zhufeng";

var str2="zhufeng2015";

var res1=reg.test(str1);//判断这个字符串是否符合我们的这个规则[包含0-9之间的任意一个数据即可]

console.log(res1);//false 不符合返回false 符合返回true

var res2=reg.test(str2);

console.log(res2);//true

例2

varreg=/^\d$/;//以0-9之间的数子开始和结束,并且中间只能包含一个数字var str1="8";

var res1=reg.test(str1);

console.log(res1);//true

例3

varreg=/^\d+$/;//以0-9之间的数子开始和结束,并且中间只能包含一到多个数字

var str1="8253";

var res1=reg.test(str1);

console.log(res1);//true

例4

varreg=/^\d{11}$/;//简单的手机号码验证正则,只能是数字并且是11位varreg=/^12.5$/;//注意:这里面的.代表是是除了换行外的任意字符,而不是小数点。

如果我想让他只代表小数点,varreg=/^12\.5$/;需要用转译字符来处理

console.log(reg.test("12.5"));

此时需要注意的是:

varreg=/^[12.5]$/;//[]包起来的里面都是代表本身意思的字符,没有特殊意义,.就是小数.

console.log(reg.test("."));//true

例5

varreg=/^wo(r|y)d$/;

//():正则的分组:大正则中的小括号是小正则,改变了默认的优先级console.log(reg.test("word"));//true

console.log(reg.test("woyd"));//true

console.log(reg.test("wor"));//false 没有以d结束

console.log(reg.test("yd"));//false

console.log(reg.test("woryd"));//false

例6

varreg=/^[word]$/;//这个代表的是只能是以word中的一个开头结束

console.log(reg.test("w"));//true

console.log(reg.test("o"));//true

console.log(reg.test("wo"));//false

想反:考虑下这个问题,不会得再找我啊^_^。

varreg=/^[^word]$/;

console.log(reg.test("w"));//

console.log(reg.test("o"));//

console.log(reg.test("wo"));//

exec : 正则捕获的方法(正则的捕获是懒惰的。)

1.首先拿我们的字符串和正则进行匹配,如果不匹配,捕获的结果是null

2.只有匹配,才按照规则进行捕获

通过exec如果可以获取到内容的话是一个数组(跟平时的长得不是很一样)第一项是捕获到的内容,index是捕获到的索引,input我们捕获的那个原始的字符串

正则的捕获是懒惰的,默认只捕获第一个符合条件的,例如:只得到了2015,但是没有获取2014

正则的捕获是贪婪的,默认按照匹配最长的捕获。例如:捕获的是2015而不是2

如何取消正则的贪婪性,在量词元字符后面加?即可,出现在普通元字符后面代表出现0-1次,如果出现在量词元字符后面代表取消正则的贪婪性。

例子:

//1)可以加一个全局的修饰符g,需要捕获几次,我们就执行几次,这样就能都捕获到了

varreg=/\d+?/g;//varreg=/\d+/g;

varary=[];

varstr="zhufeng2015peixun2014";

var res=reg.exec(str);

while(res){

ary.push(res[0]);

res=reg.exec(str);

}

console.log(ary);

例子:

varreg=/\d+/g;

console.log(https://www.360docs.net/doc/0f329985.html,stIndex);

console.log(reg.exec("zhufeng2015peixun2014"));//["2015", index: 7, input: "zhufeng2015peixun2014"]

console.log(https://www.360docs.net/doc/0f329985.html,stIndex);

console.log(reg.exec("zhufeng2015peixun2014"));//["2014", index: 17, input: "zhufeng2015peixun2014"]

console.log(https://www.360docs.net/doc/0f329985.html,stIndex);

console.log(reg.exec("zhufeng2015peixun2014"));//null

console.log(https://www.360docs.net/doc/0f329985.html,stIndex);

分组:用()小括号包起来的就是一个分组,也是大正则中的一个小正则。

1.改变默认的优先级

2.可以进行分组捕获

例子:

捕获到的是一个数组,第一项是大正则捕获到的内容,接下来分别是每一个小分组捕获到的内容

index 是大正则捕获的开始索引

varreg=/(\d+)([a-z]+)/;

console.log(reg.exec("zhufeng2015peixun2014"));

["2015peixun", "2015", "peixun", index: 7, input: "zhufeng2015peixun2014"]

"2015peixun" 大正则捕获的内容ary[0]

"2015" 第一个分组捕获的内容ary[1]

"peixun" 第二个分组捕获的内容ary[2]

....

注:如果不想捕获第二个分组中的内容,只需要再小括号中加?:即可

例子:

varreg=/(\d+)(?:[a-z]+)/;

console.log(reg.exec("zhufeng2015peixun2014"));

["2015peixun", "2015", index: 7, input: "zhufeng2015peixun2014"]

字符串中也有一个捕获的方法:match

不加全局匹配符g的时候,和我们的exec一样,大正则和分组的内容都可以捕获到

加g的时候,虽然执行一次就可以把所有的大正则匹配的内容都捕获到了(而exec需要多次操作才可以),

但是match加上g的时候不能捕获到小分组中的内容。

例子:

varreg=/(\d+)([a-z]+)/;

varstr="zhufeng2015peixun2014";

console.log(str.match(reg));

["2015peixun", "2015", "peixun", index: 7, input: "zhufeng2015peixun2014"]

和下面例子进行比较,区分

var reg1=/(\d+)([a-z]+)/g;

var str1="zhufeng2015peixun2014";

console.log(str1.match(reg1));//[2015peixun]

分组的引用:

当我们发现正则中的某一部分需要和另外一部分匹配的内容一模一样才可以,这样的情况下我们用分组引用来解决。

如下例子:

varreg=/(\d+)zhufeng\1/;// \1就是对第一个分组的引用

\1代表的是和第一分组\d+一模一样的内容

console.log(reg.test("2015zhufeng2015"));//true

console.log(reg.test("2015zhufeng2014"));//false

下面是一些常用的正则整理:

1.匹配一个有效数字:正数、负数、0、小数

varreg=/^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;

2.是正整数的

varreg=/^[1-9]\d*$/;

3.年龄18-65:18 19 2-5 0-9 60 61 62 63 64 65

varreg=/^(?:1[8-9])|(?:[2-9]\d)|(?:6[0-5])$/;//只匹配不捕获

4.中国标准真实姓名:最多四个最少两个汉字

varreg=/^[\u4e00-\u9fa5]{2,4}/;

5.昵称:数字字母下划线中线汉字

varreg=/^(\w)-|[\u4e00-\u9fa5]+$}/;

6.邮箱.cpm .cnxxx@xxx.xxx.xxxxxx@xxx.xxx

varreg=/^(?:[0-9_a-z.A-Z-]+)@(?:[0-9a-zA-Z]+)(?:\.[a-zA-Z]{2,4}){1,2}$/;

7.身份证号

varreg=/^(\d{3})(\d{3})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;

console.log(reg.exec("350321************"));

//["350321************ ", "350", "321", "1991", "01", "01", "2", index: 0, input: "350321************ "]

字符串中的replace方法,我们第一个参数如果写的是正则,没匹配一次replace 就执行一次(不要忘记加g)

字符串中的replace方法,可以捕获正则匹配的内容,如果我们第二个参数传递的是一个function,

每捕获一次我们的函数就执行一次,并且不光光是执行,执行的时候浏览器还默认传递了参数

例子:判断字符出现的次数

varstr="zhufengpeixunyangfengqihang";

//把每一个字母出现的次数进行统计

varobj={};

str.replace(/[a-zA-Z]/gi,function(){

var a=arguments[0];//当前捕获到的内容

if(obj[a]>=1){

obj[a]=obj[a]+1;

}else{

obj[a]=1;

}

});

console.log(obj);//Object {z: 1, h: 2, u: 2, f: 2, e: 3…}

例子:将小写的数字转大写

varstr="8872840";

varary=["零","壹","贰","叁","肆","伍","陆","柒","坝","九","十",];

str=str.replace(/\d/g,function(){

//var cur=arguments[0];

returnary[arguments[0]];

});

console.log(str);

以上是一些资料和个人理解的正则整理,欢迎大家更新,指正。

2015/08/15 by 林雅贞

正则表达式

正则表达式 一、什么是这则表达式 正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于搜索、编辑或者是操作文本和数据。它超出了java程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式。一般使用的java.util.regex API所支持的正则表达式语法。 二、测试用具 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex{ public static void main(String[]args)throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); if(br==null){ System.out.println("没有输入任何数据"); System.exit(1); } while(true){ System.out.print("输入表达式:"); Pattern pattern=https://www.360docs.net/doc/0f329985.html,pile(br.readLine()); System.out.print("输入字符串:"); Matcher matcher=pattern.matcher(br.readLine()); boolean found=false; while(matcher.find()){ System.out.println("找到子字符串"+matcher.group()+" 开始于索引"+matcher.start()+"结束于索引"+matcher.end()+"\n") found=true; } if(!found){ System.out.println("没有找到子字符串\n"); } } } }

JS正则表达式大全

JS正则表达式大全 JS正则表达式大全【1】 正则表达式中的特殊字符【留着以后查用】字符含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" * 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa + 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa ? 匹配前面元字符0次或1次,/ba*/将匹配b,ba (x) 匹配x保存x在名为$1...$9的变量中 x|y 匹配x或y {n} 精确匹配n次 {n,} 匹配n次以上 {n,m} 匹配n-m次 [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) [^xyz] 不匹配这个集合中的任何一个字符 [\b] 匹配一个退格符 \b 匹配一个单词的边界 \B 匹配一个单词的非边界 \cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M \d 匹配一个字数字符,/\d/ = /[0-9]/ \D 匹配一个非字数字符,/\D/ = /[^0-9]/ \n 匹配一个换行符 \r 匹配一个回车符 \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 \S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ \t 匹配一个制表符 \v 匹配一个重直制表符 \w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配

js正则表达式使用

js正则表达式使用 一,概述 1,正则表达式,可以说是任何一种编程语言都提供的机制,它主要是提供了对字符串的处理能力。 2,正则表达式在页面处理中的使用场景: 1)表单验证。验证某些域符合某种规则,例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等 2)处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象,一个例子就是定位id属性中含有某个特殊字符的div对象。 3)纯编程逻辑。直接用于编程的逻辑之中。 3,说明:本部分所举的正则表达式的代码片断,都是经过测试的,但有一点需要注意,对于换行的字符串的定义,我们在表述时使用的是类似如下的形式: var str=“It?s is a beautiful city”; 这种形式直接写在JS代码中是错误的,那如何获取具有换行的字符串呢?简单的办法:在textarea中输入文本并换行,然后将该值赋给JS变量即可。例如: var str=document.forms[0].mytextarea.value; 二,语法与使用 1,定义正则表达式 1)定义正则表达式有两种形式,一种是普通方式,一种是构造函数方式。 2)普通方式:var reg=/表达式/附加参数 表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符,来代表特殊的规则,后面会详细说明。 附加参数:用来扩展表达式的含义,目前主要有三个参数: g:代表可以进行全局匹配。 i:代表不区分大小写匹配。 m:代表可以进行多行匹配。 上面三个参数,可以任意组合,代表复合含义,当然也可以不加参数。 例子: var reg=/a*b/; var reg=/abc+f/g; 3)构造函数方式:var reg=new RegExp(“表达式”,”附加参数”); 其中“表达式”与“附加参数”的含义与上面那种定义方式中的含义相同。 例子: var reg=new RegExp(“a*b”); var reg=new RegExp(“abc+f”,”g”); 4)普通方式与构造函数方式的区别 普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,也可以是一个js变量,例如根据用户的输入来作为表达式参数等等: var reg=new RegExp(document.forms[0].exprfiled.value,”g”);

js 验证各种格式类型的正则表达式

JavaScript code: javascript replace()方法正则实例: 先看看简单例子:将所有单词首字母换成大写。 由上可知,当正则表达式有"g"标志时,代表将处理整个字符串,即函数change的变换将应用于所有匹配的对象。而该函数有三个或更多参数,具体个数视正则表达式而定。 有了函数与正则表达式的配合,replace()处理字符串的功能空前强大起来了!javascript replace()方法实现倒序: 最后还举个例子,将字符串所有单词倒序,用replace()处理是如此简单。