源自跟奈落大叔的讨论,PHP和JavaScript的比较。

正则:

先说几个正则写法:

() 选择匹配一组, (?:) 降低 () 的优先级, .*? 和 .+? ,阻止 . 和 + 的贪婪。

还有一些正则的高级写法:

(?=) 和 (?<=) ,零宽断言,以及 (?!) 和 (?<!) ,负向零宽,详见:百度百科(正则表达式)

以及js里正则常用的方法:

reg.test(str) 检测reg是否匹配str中的内容,返回true或false。

match:

先来一个例子:

var url="http://www.cnblogs.com/rubylouvre/p/3181291.html#top22";
var a=url.match(/t/); // ["t"] // 找一个
console.log(a.index); // 1 // 找一个,带着它所在的位置(index)
url.match(/t/g); // ["t", "t", "t", "t"] // 找一堆,不带index
url.match(/(t)/); // ["t", "t"] // 带括号找一个,第一个是结果,第二个是括号里匹配到的内容
url.match(/(t)/i); // ["t", "t"] // 带括号加i,跟没加一样,没有特殊
url.match(/(t)/g); // ["t", "t", "t", "t"] // 带括号加g,只有结果
url.match(/(?:t)/); // ["t"] // 使用?:取消()的优先级,有index属性
url.match(/(?:t)/g); // ["t", "t", "t", "t"] // 加上g后依然返回一堆

上面几个,带上g标记,会得到所有匹配的内容,不带g则只会匹配到第一个结果(也是数组),而且这个数组多了index属性,表示匹配内容所在的位置。

而i标记不会影响结果个数,每出现一个 () 都会在匹配结果中增加一项,而改为 (?:) 后则不会增加。即使增加了,也是只匹配出一个结果,数组依然有index属性。

鼓捣了一下午,弄了个高端且粗糙的:

var url="http://www.cnblogs.com/rubylouvre/p/3181291.html#top22";
url.match(/(.*?):\/{2}(.*?)\/([^\?#]*(?=\/[^\/]*)[\/$])([^\?#]*)([\?#].*)?/);
// ["http://www.cnblogs.com/rubylouvre/p/3181291.html#top22", "http", "www.cnblogs.com", "rubylouvre/p/", "3181291.html", "#top22"]

返回结果:[整个地址,协议名称,域名,文件路径,文件名,hash/search]。

写法有很多,这里只是想用一下 (?=) 方式,以我现在的水平,只要结果对就好。。

replace:

以前用replace,主要是像 str.replace(reg/str,str/function(s){return fn(s)}); 这样,现在要加上正则的用法:反向引用。

先来一个例子:

var str="abcdefg";
str.replace(/([abc])/g,"$&,"); // "a,b,c,defg"
str.replace(/([abc])([bcd])/g,"$&,"); // "ab,cd,efg"
str.replace(/([abc])([bcd])/g,"$1,$2;"); // "a,b;c,d;efg"

可以在后面的替换字符串里,用 $& 表示匹配出的结果,相当于match结果的第[0]个(其实PHP中就是用 &0 来表示的),用 &n 来表示第n个小括号里匹配出的内容,相当于match结果中的第[n]个。

出了这两个,还有 &` 表示匹配结果左侧的内容, &' 表示匹配结果右侧的内容, $$ 表示替换成一个$符。

收获:

正则里,还有js对正则的使用,都有很多东西值得挖掘。

神奇的match和replace的更多相关文章

  1. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

  2. JavaScript中字符串的match与replace方法

    1.match方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. match()方法的返回值为:存放匹配结果的数组. 2.replace方法 replace() 方 ...

  3. js字符串和正则表达式中的match、replace、exec等函数详解

    正则并不是经常使用,而正则和字符串之间的函数关系又错综复杂,谁是谁的函数,又是怎么样的一种结果,往往我们是看一遍忘一遍,对此我是头疼不已,感觉自己是个笨蛋^_^. 为了以后不再查文档,特此把常用的函数 ...

  4. js字符串和正则表达式中的match、replace、exec等的配合使用

    正则并不是经常使用,而正则和字符串之间的函数关系又错综复杂,谁是谁的函数,又是怎么样的一种结果,往往我们是看一遍忘一遍,对此我是头疼不已,感觉自己是个笨蛋^_^. 为了以后不再查文档,特此把常用的函数 ...

  5. Javascript Regexp match and replace

    # add a new article reference to database function addnewpub() { var year = $("input#year" ...

  6. 全面解析JS字符串和正则表达式中的match、replace、exec等函数

    转自:https://www.jb51.net/article/87730.htm 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将 ...

  7. javascript正则表达式总结(test|match|search|replace|split|exec)

    test:测试string是否包含有匹配结果,包含返回true,不包含返回false. <script type="text/javascript"> var str ...

  8. 正则表达式中的exec和match方法的区别

    正则表达式中的exec和match方法的区别 字符串的正则方法有:match().replace().search().split() 正则对象的方法有:exec().test() 1.match m ...

  9. js正则表达式replace里有变量的解决方法用到RegExp类

    一直比较害怕使用正则表达式,貌似很深奥很复杂的样子,所以在用js操作字符串的时候,我最多使用的是replace.split.substring.indexOf等函数,这些函数有时候需要多次叠加使用,但 ...

随机推荐

  1. 搭建splinter+python环境时遇到的错误

    因为不想用urllib2了,没有用过splinter,今天就想试试,毕竟后者支持的功能更人性化/自动化. 1,安装splinter 安装过程很简单,安装了pip的话,执行: $ [sudo] pip ...

  2. 标签 Attribute

    在一个类上面放一个标签,可以用来表示一些特定规则,比如某个对象的某个属性不想被json化,那么我们在它头上放个标签就行了,或是做ORM时指定某个Class对应的table名字等. 最后标签是通过反射来 ...

  3. 关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结

    方式一: 已将图片保存到drawable目录下,通过图片id获得Drawable或者Bitmap,此方式最常用.(若只知道图片的名称,还可以通过图片的名称获得图片的id) (1)通过图片id获得Dra ...

  4. cxgrid按条件计算合计值 TcxTreeList计算合计值

    在Footer的第一列显示[合计:] 加一个Summary项,Column设为Grid的第一列,Kind设为skNone 在该Summary项的OnGetText事件中,输入: procedure T ...

  5. AsyncTask和Handler的优缺点比较

    AsyncTask实现的原理和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口 ...

  6. Spring MVC 前后台数据交互

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址地址:<Spring MVC 前后台数据交互> 1.服务端数据到客户端 (1)返回页面,Controller中方法 ...

  7. ORACLE STUDY NOTES 01

    [JSU]LJDragon's Oracle course notes In the first semester, junior year DML数据操纵语言 DML指:update,delete, ...

  8. 中介者模式(Mediator) 笔记

    中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 类图: Medi ...

  9. INSERT command denied to user

    问题分析: 网站运行突然出现下面的 MySQL 错误: 645297 [http-88-13] ERROR com.mes.cart.dao.impl.CartDAOImpl - CartDAOImp ...

  10. Java体系总结

    一.Java SE部分 1.java基础:基础语法:面向对象(重点):集合框架(重点):常见类库API: 2.java界面编程:AWT:事件机制:Swing: 3.java高级知识:Annotatio ...