幸好电脑有搜索功能,关键字一查询很是方便。这里是我以前看javascript高级编程一书中记录下来的关于正则表达式的一些东西,好多也可以运用的别的正则当中.
最基本的写法:var reCat = new RegExp("cat");
带参数的学法:var reCat = new RegExp("cat","g");其中参数g表示匹配字符串中出现的所有"cat".如果不区分大小写,可以加入"i"参数.如var reCat = new RegExp("cat","gi") 匹配所有,并且不区分大小写.
g是global的缩写,i是case-insensitive的缩写
Perl风格的正则表达式字面量写法:var reCat = /cat/gi 一对"/"表示开始结束.
//--------------------------------------正则表达式中的方法使用------------------------------------------
test()方法的使用:
var sToMatch = "cat"; //用以匹配的源字符串串
var reCat = /cat/; //正则表达式对象
var reCat.test(sToMatch); //调用RegExp的test方法来匹配.出现一次也返回true;
exec()方法的使用:
var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; //用以匹配的源字符串串
var reAt = /at/; //正则表达式对象
var var arrMatches = reAt.exec(sToMatch); //调用RegExp的exec方法来匹配.
exec()方法返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用.
这里,arrMatches只包含一个条目:第一个"at"的实例(在单词"bat"中的那个).
match()方法的使用:
var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; //用以匹配的源字符串串
var reAt = /at/gi;
var arrMatches = sToMatch.match(reAt);
match()返回包含在字符串中的所有的匹配的数组.
arrMatches[0] = "at"; //"bat"
arrMatches[1] = "at"; //"Cat"
arrMatches[2] = "At"; //"fAt"
arrMatches[3] = "aT"; //"baT"
arrMatches[4] = "aT"; //"faT"
arrMatches[4] = "at"; //"cat"
search()方法的使用:
var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; //用以匹配的源字符串串
var reAt = /at/gi;
alert(sToMatch.search(reAt)); //outputs "3";
这个方法和indexOf()有些类似,但是这个使用的是一个RegExp对象而非仅仅一个字符串.返回字符串中出现的第一个匹配的位置
//------------------------------------------字符串中方法带正则表达式的使用-----------------------------
replace()方法的使用
1.
var sToChange = "The sky is red. ";
var reRed = /red/;
//alert(sToChange.replace("red","blue")); //这是以前的普通写法
alert(sToChange.replace(reRed,"blue")); //outputs "The sky is blue"
这里第一个参数用正则表达式代替,"blue"替换了正则表达式匹配的单词.所以输出"The sky is blue".
2.
var sToChange = "The sky is red. ";
var reRed = /red/;
var sResultText = sToChange.replace(reRed,function(sMatch) {
return "blue";
});
alert(sResultText);
这里演示了第二个参数为匿名方法的使用.第一个参数同样是一个RegExp类.
注意:这里的替换只替换第一出现的"red"也就是说如果源字符串是:"The sky is red. I like red." 那么替换后的结果是"The sky is blue. I like red."如果想替换所有的red,那么RegExp表达式应该添加参数,如:/red/g
split()方法的使用:
var sColor = "red,blue,yellow,green";
//var arrColors = sColor.split(","); //以前的普通写法
var reComma = /\,/;
var arrColors = sColor.split(reComma);
虽然结果和普通写法一样,但是这里传入的是一个RegExp类型.注意","在正则表达式中有自己的含义,所以这里用"\"转译.
//----------------------------------------正则表达式中的几个元字符--------------------------------------------
元字符作为字面量时都需要转义,js中的元字符包括下面十二个
( [ { \ ^ $ | ) ? * + .
几个简单实例:
匹配一个问号: var reQMark = /\?/; 或者 var reQMark = new RegExp("\\?");
第二实例为什么要用两个"\",因为"\"在字符串中也是属于转义字符.即"\\"转换后是"\".(我叙述不清有点乱,自行理解.)
也可以用ASCII来表示字符:(提一下)
var sColor = "blue";
var reB = /\x62/;
alert(reB.test(sColor)); //匹配b,outputs "true";
另外还有些预定义的字符,大致和平时使用的一样含义:
\t制表符 \n换行 \r回车 \f换页 \a(alert字符) \e(escape)字符 \cX(与X相对应的控制字符) \b回退字符 \v垂直制表符 \0 空字符
实例(删除字符中所有的换行符):
var sNewString = sStringWithNewLines.replace(/\n/g,"");
//----------------------------------------字符类-------------------------------------------------------
字符类分为好几种:简单类,负向类,范围类,组合类和预定义类.
1.简单类
var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; //用以匹配的源字符串串
var reBatCatRat = /[bcf]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
输出结果:
alert(arrMatches.length); //outputs "5";
arrMatches[0] == "bat"; //true
arrMatches[1] == "Cat"; //true
arrMatches[2] == "fAt"; //true
arrMatches[3] == "faT"; //true
arrMatches[4] == "cat"; //true
2.负向类
var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; //用以匹配的源字符串串
var reBatCatRat = /[^bc]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
输入结果:
alert(arrMatches.length); //outputs "2";
arrMatches[0] == "fAt"; //true
arrMatches[1] == "faT"; //true
3.范围类
var sToMatch = "num1,num2,num3,num4,num5,num6,num7,num8,num9";
var reOneToFour = /num[1-4]/gi;
var arrMatches = sToMatch.match(reOneToFour);
4.组合类(combination class)
var reCombination = /[a-mA-M1-4\n]/; //匹配一个a到m或者A-M或者1-4或者一个换行符的字符
5.预定义类
____________________________________________________
. [^\n\r] 除了换行和回车之外的任意字符
\d [0-9] 数字
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白字符
\S [^\t\n\x0B\f\r] 非空白字符
\w [a-zA-Z_0-9] 所有的字母,所有的数字和下划线(单词字符)
\W [^a-zA-Z_0-9] 非单词字符
//----------------------------------------量词------------------------------------------------------
1.简单量词
? 出现0次或1次
* 任意次
+ 至少一次
{n} 一定出现n次
{n,m} 至少n次,最多m次
{n,} 至少出现n次
2.贪婪的,惰性的和支配性的量词
贪婪的:先看整个的字符串是否匹配,如果没有发现匹配,去掉该字符中的最后一个字符,并且再次尝试.一直如此重复,直到发现一个匹配或者字符串中不剩任何字符.
惰性的:先看第一个字符是否匹配,如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串,如果还是不够,重复前一步工作,直到发现匹配或者整个字符串都经检查过无匹配.
支配性的:只尝试匹配整个个字符串,如果整个字符串不能产生匹配,不做进一步尝试.
默认的简单量词就是贪婪的,如果想使用惰性的则多加一个"?"号,而支配性的则是"+"号.
贪婪 惰性 支配
? ?? ?+
* *? *+
+ +? ++
{n} {n}? {n}+
{n,m} {n,m}? {n,m}+
{n,} {n,}? {n,}+
问题(想获得匹配是:"abbb","aabbb","aaabbb",应该是那种匹配):
var sToMatch = "abbbaabbbaaabbb1234";
var re1 = /.*bbb/g; //贪婪匹配
var re2 = /.*?bbb/g; //惰性匹配
var re3 = /.*+bbb/g; //支配匹配
答案自行思考.
//-----------------------------------------正则表达式中的分组-------------------------------------------------
var regDogDog = /(dog){2}/g; 相当于 var regDogDog = /dogdog/g;
前者利用了分组,把dog看作一组,后面跟了一个量词,表示出现的次数.这就是个简单的分组.
当然可以分组套分组
var re = /(mom( and dad)?)/; //match "mom" or "mom and dad"
匹配一个头尾空白的: var reExtraSpace = /^\s*(.*?)\s+$/;
这样可以自定义自己的trim函数了.
String.prototype.trim = function() {
var reExtraSpace = /^\s*(.*?)\s+$/;
return this.replace(reExtraSpace,"$1");
};
var sTest = " this is a test ";
alert("[" + sTest + "]"); //outputs "[ this is a test ]"
alert("[" + sTest.trim() + "]"); //outputs "[this is a test]";
分组中的反向引用:
如表达式(A?(B?(C?)))将产生三个反向引用
a.(A?(B?(C?)))
b.(B?(C?))
c.(C?)
反向引用可以使用test(),match(),search()方法后,从RegExp构造函数中获得:
var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1) //outputs "123456789"
var sToMatch = "dogdog";
var reDogDog = /(dog)\1/;
alert(reDogDog.test(sToMatch)); //outputs "true"
reDogDog首先创建一个dog的组,然后又被特殊转义序列\1引用,使得这个正则表达式等同于/dogdog/.
var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/;
var sNew = sToChange.replace(reMatch,"$2 $1");
alert(sNew); //outputs "5678 1234"
非捕获性分组:在分组的左括号后面添加"?:"符号即可.
var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1); //outputs ""
在较长的正则表达式中存储反向引用会降低匹配速度,非捕获性分组可以提高性能,因为它不会存储反向引用
String.prototype.stripHTML = funciton() {
var regTag = /<(?:.|\s)*?>/g; //非捕获分组,匹配"<"和任意数量的"."或者空白,并且是惰性模式.最后是">"
return this.replace(reTag,"");
};
var sTest = "<b>This would be bold </b>";
alert(sTest.stripHTML()); //outputs "This would be bold"
-----------------------------------候选(OR)模式------------------------------------------------------------
//分组OR模式并获取
var sToMatch1 = "red";
var sToMatch2 = "black";
var sToMatch3 = "green";
var reRedOrBlack = /(red|black|green)/;
alert(reRedOrBlack.test(stoMatch1) + " : " + reRedOrBlack.$1); //outputs "true : red"
alert(reRedOrBlack.test(stoMatch2) + " : " + reRedOrBlack.$1); //outputs "true : black"
alert(reRedOrBlack.test(stoMatch3) + " : " + reRedOrBlack.$1); //outputs "true : green"
//替换脏话
var reBadWords = /badword|anotherbadword/gi;
var sUserInput = "This is a string using badword1 and badword2.";
var sFinalText = sUserInput.replace(reBadWords,"****");
alert(sFinalText); //outputs "This is a string using **** and ****"
-----------------------------------前瞻..后顾------------------------------------------------
(?<= ... ) 后顾等
(?<! ... ) 后顾不等
(?= ...) 前瞻等
(?! ...) 前瞻不等
前瞻(lookahead)告诉正则表达式向前看一些字符,而不移动其位置.
前瞻分为正向前瞻后负向前瞻.
正向前瞻表示后面跟的内容匹配前瞻内容(方向都是 --->),而负向则后面跟的内容不匹配其前瞻内容.
创建正向前瞻将模式放在(?=和)之间,注意:这不是分组.
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?=room))/; //注意(?=room)不是分组,而是正向前瞻
alert(reBed.test(sToMatch1)); //outputs "true"
alert(regExp.$1); //outputs "bd"
alert(reBed.test(sToMatch2)); //outputs "false"
负向前瞻的创建放在(?!和)之间
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?!room))/; //负向前瞻(?!room),不是分组! //负向前沿只匹配后面不跟着"room"的bed
alert(reBed.test(sToMatch1)); //outputs "false"
alert(reBed.test(sToMatch2)); //outputs "true"
alert(RegExp.$1); //outputs "bed"
至于后顾,和前瞻类似.
-----------------------------------------------------边界------------------------------------------
^ 行开头
$ 行结尾
\b 单词边界
\B 非单词边界
查找一个单词,但他只出现在行尾
var sToMatch = "Important word is the last one.";
var reLastWord = /(\w+)\.$/;
reLastWord.test(sToMatch);
alert(RegExp.$1); //outputs "one"
查找一个单词,但值出现在行首
var sToMatch = "Important word is the last one.";
var reFirstWord = /^(\.+?)\b/; //这里用惰性,如果是贪婪,则匹配整个字符转了
//var reFirstWord = /^(\w+)/; //这个也可行
reFirstWord.test(sToMatch);
alert(RegExp.$1); //outputs "Important"
抽取单词
var sToMatch = "First second third fourth fifth sixth";
var reWords = /\b(\S+?)\b/g;
//var reWords = /(\w+)/g; //这个也行
var arrWords = sToMatch.match(reWords);
------------------------------------多行模式------------------------------------
var sToMatch = "First second\nthird fourth\nfifth sixth";
var reLastWordOnLine = /(\w+)$/g;
var arrWords = reLastWordOnLine.match(sToMatch);
这里获取的最后一个单词是sixth,但实际上有3行,想获取的单词是sencond,fourth和sixth.所以需要在第二句话添加一个参数m.
var reLastWordOnLine = /(\w+)$/gm;
这样,添加m后会把换行符解析为一个$,并且也是一个^的开始.
所以匹配 var reFirstWordOnline = /^(\w+)/;也会获得期望的三个单词而不是一个.
----------------------------------RegExp对象--------------------------------
global -- Boolean,表示g(全局选项)
ignoreCase -- Boolean,表示i是否忽略大小写
lastIndex -- int 表示下次匹配将会从哪个字符位置开始(只有使用exec()或test()函数才会填入,否则为0)
multiline -- Boolean,表示m(多行模式选项)
source -- 表达式的字面量形式.如:/[ba]*/的source返回"[ba]*"
var sToMatch = "bbq is short for barbecue";
var reB = /b/g;
reB.exec(sToMatch);
alert(reB.lastIndex); //outputs "1"
reB.exec(sToMatch);
alert(reB.lastIndex); //outputs "2"
reB.exec(sToMatch);
alert(reB.lastIndex); //outputs "18"
//reB.lastIndex = 0;
//alert(reB.lastIndex); //如果改变索引后:outputs "1"
reB.exec(sToMatch);
alert(reB.lastIndex); //outputs "21"
静态属性
完整名 短名字 功能
input $_ 最后用于匹配的字符串(传递给exec()或test()的字符串)
lastMatch $& 最后匹配的字符
lastParent $+ 最后匹配的分组
leftContext $` 在上次匹配的前面的字串
multiline $* 用于指定是否所有的表达式都使用多行模式的布尔值
rightContext $' 在上次匹配之后的字串
var sToMatch = "this has been a short, short summer";
var reShort = /(s)hort/g;
reShort.test(sToMatch);
alert(RegExp.input); //outputs "this has been a short, short summer"
alert(RegExp.leftContext); //outputs "this has been a "
alert(RegExp.rightContext); //outputs ", short summer"
alert(RegExp.lashMatch); //outputs "short"
alert(RegExp.lastParen); //outputs "s"
分享到:
相关推荐
Python正则表达式全套笔记v0.3 本文档是小小明个人笔记,涵盖了正则表达式的各个方面,包括各种模式、分组、断言、匹配、查找、替换和切割等。文档中提供了详细的正则匹配规则表,涵盖了基本字符规则、预定义字符集...
### 正则表达式基础知识与应用 #### 一、正则表达式的定义及用途 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助我们实现字符串的搜索、替换等操作。它在多种编程语言中都有应用,尤其是在...
以上列举了一些常见的正则表达式应用场景及其匹配规则,可以帮助开发者更好地理解和掌握Java正则表达式的使用技巧。通过这些示例,我们可以看到正则表达式在实际开发中的强大作用,并且能够灵活应用于各种复杂的字符...
### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强有力的模式匹配工具,广泛应用于各种编程语言中,用于文本处理。正则表达式允许用户定义复杂的查找模式,这对于数据验证、搜索和替换操作特别...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
JavaScript中的正则表达式是处理字符串的强大工具,用于匹配、替换、分割文本。它们在编程中扮演着不可或缺的角色,尤其在验证用户输入、提取数据、格式化内容等方面。以下是对正则表达式的基础知识和常见用法的详细...
这篇学习笔记将深入探讨JavaScript正则表达式的概念、语法和实际应用。 一、正则表达式基础 1. 创建正则表达式: - 字面量表示法:`/pattern/flags` - 构造函数:`new RegExp('pattern', 'flags')` 2. 常见的...
### 正则表达式大全笔记总结 #### 一、引言 正则表达式是一种用于匹配字符串的强大工具,在数据处理、文本分析等场景下极为常见。本文将对几个常见的正则表达式应用场景进行总结,包括中国电话号码验证、邮政编码...
### Python正则表达式详解 #### 一、正则表达式概述 正则表达式(Regular Expression)是一种在计算机科学领域广泛使用的模式匹配工具。它主要用于处理文本数据,包括搜索、替换以及提取文本中的特定模式。许多...
正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配、搜索、替换和提取信息。它在软件开发中广泛应用于数据验证、文本处理、输入校验等场景。正则表达式通过特殊的语法和运算符,允许程序员构建灵活且...
### 正则表达式学习笔记详解 正则表达式(Regular Expression)是一种强大的文本匹配工具,广泛应用于数据处理、文本搜索、格式验证等场景。以下是对给定文件中提到的各种正则表达式的详细解析,旨在帮助读者深入...
这篇入门笔记实例将带你深入了解正则表达式的使用。 1. **正则表达式基础** - **模式定义**:正则表达式由特殊字符(元字符)和普通字符组成,用于描述文本模式。 - **创建方式**:可以使用`/pattern/flags`或`...
好东西才与大家分享!这是博客园一位老师的正则表达式教学笔记,很精炼的阐述,看了你一定不后悔……
以下是一些常用的正则表达式模式及其应用: 1. 数字验证: - `^[0-9]{1,20}$`:检查字符串是否全由1到20个数字组成。 - `^\d+$` 或 `^[0-9]+$`:匹配非负整数(正整数+0)。 2. 字符串格式验证: - `^[a-zA-Z]{...
正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配、查找和替换操作。在Java中,正则表达式主要涉及到`java.lang.String`、`java.util.regex.Pattern`和`java.util.regex.Matcher`这三个类。下面我们...
4. **学习正则的学习笔记**:可能包含一份详细的正则表达式学习资料,涵盖了基础概念如元字符、量词、字符类等,以及高级特性如分组、后向引用、预查等,方便用户系统学习。 5. **正则表达式参考手册**:可能提供了...