`
zccst
  • 浏览: 3310009 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[正则表达式]自己使用总结(大纲)

阅读更多
作者:zccst

感觉正则表达式就像一个妖怪,一会觉得难得不行了,一会又觉得没那么难,这种感觉交替出现很多次了。还有就是一开始觉得完全看不懂的正则在耐心看了一段时间后,竟然看懂了,然后一点也不觉得难了。



2014-04-23
一、基础


3,圆括号的几种含义
除了改变优先级的基本概念外,圆括号还有分组的功能。




2,贪婪/非模式,及对应的 ?: ?= ?!=
贪婪:尽可能多的匹配
不贪婪:在遇到限定符*,+,?,{n},{n,},{n,m}时,例'o+?'匹配o,'o+'匹配所有
patten
?:patten  industr(?:y|ies)
?=patten  windows?=95|98|2000
?!=patten  windows?!=95|98|2000






1,常用各种语法
(1)
直接量字符
\0  \t  \n  \v  \f  \r  \b(匹配一个单词边界), \B(不匹配单词边界)
\NUM(匹配NUM个,如(.)\1匹配两个连续相同的字符), \oNUM(八进制), \xNUM(十六进制)

元字符  ^, $ . :  = 

.    匹配除"\r\n"之外的任何单个字符。要匹配包括"\r\n"在内的任何字符,请使用像"[\s\S]"模式
/notFound.png$/.test("images/notFound.png");//true
/notFound\.png$/.test("images/notFound.png");//true
批注:如果想使用元字符,需要加反斜杠转义。


(2)字符
\s(匹配空白字符), \S(匹配非空白字符)
\w(匹配字母,数字或下划线字符), \W
\d(匹配一个数字,/\d/=/[0-9]/), \D(非数字,/\D/=/[^0-9]/)
[a-z]表示匹配字符集中任意一个,[^a-z]不匹配字符集中任意一个

(3)重复
*(0次或多次),  +(1次或多次),  ?(0次或1次)
例子:
/\s+java\s+/  匹配前后带有一个或多个空格的字符串"java"
/[^(]*/       匹配一个或多个左括号的字符

{n}匹配n次,{n,m} 表示匹配n到m次数,{n,}匹配n次以上
例子1:
/\d{2,4}/     匹配2-4个数字
/\w{3}\d?/    精确匹配三个单词和一个可选的数字

例子2:'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
例子3:\{([a-zA-Z_]{3,})\}
解析,
(1)先看括号内([a-zA-Z_]{3,})
[a-zA-Z_] 意思是匹配a-z、A-Z和下划线字符
{3,} 意思是上面的重复三次及以上,即连续三个字符及以上为符合条件
(2)在大括号内\{\}
如果不用转移,{}相当于出现次数,如果使用转移,则为大括号自身。







二、函数

1,RegExp函数
exec
test

2,字符串函数
match
search
replace
split


1,RegExp函数

(1)exec
exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。


function execDemo(){
    var r, re; // 声明变量。 
    var s = "The rain in Spain falls mainly in the plain mainly";
    re = /[\w]*(ai)n(ly)/ig;
    r = re.exec(s);//此结果只是匹配的第一个结果。不过里面还是一个数组
    document.write(r + "<br/>"); 
    console.log(r);
    for(key in r){
        document.write(key + "-" + r[key] + "<br/>");
        console.log(key , "-" , r[key])
    } 
    alert(r['lastIndex']);
}
execDemo();

r打印出来的结果是
[0] mainly
[1] ai
[2] ly
index 24
input The rain in Spain falls mainly in the plain mainly


返回所有匹配结果,可以使用while
while ((result = re.exec(s)) != null)  {

}


(2)test
返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。
rgexp.test(str)

例如:
var browser = {};
var ua = navigator.userAgent;
//是否为Gecko内核
browser.isGecko = /gecko/i.test(ua) && !/like gecko/i.test(ua);



2,字符串函数

(1)match
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
var name = "JeffreyWay";
name.match(/e/); //e
name.match(/e/g); //e,e,还可以name.match(/e/g)[1]
var string = 'This is just a string with some 12345 and some !@#$ mixed in.';
alert(string.match(/[a-z]+/gi)); // alerts "This,is,just,a,string,with,some,and,some,mixed,in"  


理由:可以匹配一个或多个大写或小写字母。i不区分大小写,g全局

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

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


再例如:
"cid=100&from=webapp&uc_param_str=dncpeiwi".match(/(^|&)cid=([^&]*)(&|$)/)
结果是:  ["cid=100&", "", "100", "&"]
分析要点:
(1)没有使用全局g,也就是只匹配一次。
(2)第一个圆括号(^|&)表示要么以cid=开头,要么以&cid=开头
(3)第二个圆括号([^&]*)表示cid=后面跟0个或多个除了&之外的任何字符
(4)第三个圆括号的意思([^&]*)要么后面跟&,要么直接结束。
再来看结果,是一个数组,四个值,表示匹配了四次
(1)数组的第一个元素是通篇下来匹配成功的文本 cid=100&,由于没有g,只匹配了一次
其余的元素存放的是与正则表达式的子表达式匹配的文本
(2)数组的第二个元素"",表示第一个圆括号的子匹配,结果是""(cid前为空)
(3)数组的第三个元素"",表示第二个圆括号的子匹配,结果是100
(4)数组的第四个元素"",表示第三个圆括号的子匹配,结果是&
结果是组的arr[2]是我们最终想要的结果,但是由于匹配了出&外的任意字符,使用前还需要unescape一下,unescape(arr[2]);
这样就是我们最终想要的结果了。

如果改成
"pi=1&id=200&from=sina&to=a".match(/(^|&)id=([^&]*)(&|$)/)
匹配结果是
["&id=200&", "&", "200", "&"]
第一个元素是第一个圆括号的子匹配,所以匹配到了&



(2)search



(3)replace
使用详见:http://zccst.iteye.com/admin/blogs/1672814



(4)split
var str = 'this is my string';   
alert(str.split(/\s/)); // alerts "this, is, my, string",可以str.split(/\s/)[3]
分享到:
评论

相关推荐

    带你学会使用正则表达式

    正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 本门课程主要讲解正则表达式的引用场景和一些基础用法,让...

    PYTHON程序设计教学大纲.doc

    这部分将结合历史人物(如两弹一星元勋)的故事,引导学生学习字符串处理,同时训练他们在实际问题中使用正则表达式和类型转换。 控制结构部分涵盖了算法,程序编写,数据处理,分支结构,循环控制,异常处理等。...

    《Python程序设计教程》课程介绍与教学大纲.docx

    通过本课程的学习,学生将掌握Python的编程模式、运算符、内置函数、基本数据类型、列表推导式、切片、字符串方法、正则表达式、二进制文件操作、调试方法、面向对象程序设计模式和数据库操作等方面的知识。...

    课程实验大纲02091

    10. 正则表达式:掌握字符串处理和正则表达式应用。 11. 文件和数据格式化:进阶:学习json和sql文件的读写。 通过这一系列实验,学生将全面掌握Python编程,为后续课程学习和实际问题解决奠定坚实基础。

    Python程序设计-教学大纲-段震.doc

    - 正则表达式处理字符串。 - 不同领域的Python扩展模块。 - **先修课程**: 无需特定先修课程。 #### 三、课程计划 - **总学时**: 34学时,2学分。 - **教材**: 董付国,《Python程序设计》(第2版),清华大学...

    百度java贪吃蛇源码百度-JavaScriptAdvanced8:JavaScript高级联系新版

    中使用正则表达式 - typora-copy-images-to media --- JavaScript 高级 课程介绍 课程大纲 在线地址: 目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript 中使用正则表达式 案例...

    《Python程序设计基础(第2版)》教学大纲(参考).pdf

    - **正则表达式**:掌握使用正则表达式处理字符串的能力。 - **文件操作**:熟练使用Python读写文本文件与二进制文件。 - **程序调试**:了解Python程序调试的基本方法。 - **面向对象编程**:熟练运用Python编写...

    flex manual 中文手册 Loon.x翻译

    - **扩展正则表达式**: `flex`支持扩展的正则表达式,这使得模式匹配更加灵活和强大。 - **匹配规则**: 描述了`flex`如何匹配输入数据中的模式,以及匹配的具体过程。 #### 七、动作 - **动作定义**: 当模式匹配...

    Python基础知识-ppt课件(1).ppt

    Python的类库丰富,包含了许多用于文件处理、正则表达式、网络连接等任务的模块,例如内置的re模块支持正则表达式操作,使得文本处理变得简单。 Python的交互式命令行模式使得代码调试和学习变得容易,用户可以直接...

    Learning the vi and Vim Editors, Seventh Edition

    - **扩展的正则表达式**(第169页):探讨了Vim中支持的更强大的正则表达式功能,使模式匹配更加灵活。 - **可执行文件的定制**(第171页):介绍了如何定制Vim可执行文件的行为,包括自定义快捷键和插件。 #### ...

    Labview For Everyone Graphical Programming Made Easy And Fun, Third Edition.pdf

    - **正则表达式**:使用正则表达式进行复杂的数据验证和处理。 - **多态性VIs**:了解多态性VI的概念及其在实际开发中的应用价值。 - **定时结构**:使用定时循环和其他定时结构来精确控制时间敏感的任务。 ##### 3...

    北京科技大学246法语(二外)2021年初试大纲.pdf

    - **条件式与虚拟式的识别**:通过设计特定的算法,如正则表达式匹配或者模式识别算法,来识别文本中的条件式和虚拟式,进而帮助学生掌握这两种语态的使用场景和规则。 - **动态规划算法**:对于复杂的动词变位和...

    ROST CM6使用手册,软件在另外的文章。点进来就对了

    * 基于正则的特定信息抽取:使用正则表达式对文本中的特定信息进行抽取。 * 基于字段特征的行处理:对文本中的行进行基于字段特征的处理。 * 基于辅助词群的行抽取及处理:对文本中的行进行基于辅助词群的抽取和处理...

    Rational 测试工具-功能测试 课程大纲

    - **第五节:基于模式的识别** —— 探索高级识别技术,如基于模板或正则表达式的对象识别。 - **第六节:总结** —— 归纳对象地图与识别技术的学习要点。 6. **第六章:数据驱动测试** - **第一节:关于数据...

    漏洞知识大纲

    4. **分隔重写绕过**:在 WAF 使用正则表达式检测的情况下,通过插入无害的字符或使用多个请求来分割恶意 SQL 语句,使其看起来像是合法输入。 5. **HTTP 参数污染 (HPP)**:通过重复或混合使用 HTTP 参数来混淆 WAF...

    python数据分析师全套课程84讲

    - **正则表达式**:使用正则表达式进行模式匹配和替换。 #### 11. 高级函数 - **Lambda 表达式**:匿名函数的概念和使用场景。 - **Map、Filter 和 Reduce 函数**:这些内置函数的特性和用途。 #### 12. Python ...

    Visual Studio .NET 使用技巧手册

    - **功能**: 使用正则表达式或通配符进行复杂的查找和替换操作。 - **使用场景**: 当需要执行高级搜索或批量替换时。 **33. 执行全局查找或替换** - **功能**: 在整个解决方案或项目中进行查找和替换。 - **...

    SCJP模拟器及考题

    9. **Java的API库**:如Math类、日期时间API、正则表达式、网络编程等。 "SCJP大全"这个名字暗示这可能是一份全面的SCJP学习资料,包含了各种知识点的总结和实例,是备考的重要参考资料。 总之,这些资源为准备...

    eclipse快捷键方式

    **技巧提示**: Eclipse还支持正则表达式查找替换,对于复杂的查找需求特别有用。 #### 5. 转换大小写 (Ctrl+Shift+X/Y) **功能**: `Ctrl+Shift+X`用于将选中的文本转换为全大写,而`Ctrl+Shift+Y`用于转换为全小写...

Global site tag (gtag.js) - Google Analytics