玩转正则之highlight高亮
程序员在编写代码的时候少不了和字符串以及“查询”打交道,两者的交集中有一个叫做正则表达式的的东西,这家伙用好了可以提高编程效率,用不好的话...你可以先去好好学一学。
关于正则的使用,举个简单的例子:
var m = location.href.match(/(\w+:)\/{0,3}([^\/]+)(?:(\/[^\?#]*))?(?:(\?[^#]+|.+))?(?:(#.*))?/);
var res = {
protocol: m[1],
host: m[2],
path: m[3],
search: m[4],
hash: m[5]
};
console.log(res);
憋了几分钟= =||,我也觉得这个正则不是特别好理解(红黑相间了,应该稍微清晰点),有些朋友可能不知道(?:content)是什么意思,还有类似(?!content)和(?=content)分组和前瞻的知识,建议去问问度哥和谷娘。
一. 正则应用小DEMO示例
下面是一串随手写的代码,放在textarea中:
/**
* @author barret lee
* @date 2013-10-06
* @email barret.china@gmail.com
*/
//outer var
var a = "this id outer string";
//closure
function b() {
//inner var
var a = "this is inner string";
var g = a.replace(/this is inner string/g, function() {
return new Function("/*clousure*/this.a")();
});
/**
* @description closure - regExp test
* @author barret lee
*/
function c() {
return {
a: a,
g: g
}
}
return c;
}
var s = b()(); //s.a, s.g
正则匹配,处理上面那堆字符串的小DEMO:
博客园引入个js文件还真罗嗦,有时候会报XSS(跨站脚本攻击)相关的错误,(如果木有正常显示,刷新下试试)。
如果还是没有,可以看另外一个demo:SAE/highlight
跟着提示,下一步下一步多点几下,可以看出效果还是可以滴。主要是这里的正则略微的麻烦,处理一个色变得琢磨老半天。
P.S:上面这玩意儿只是一个小测试,代码相当不健壮,拿着学习正则练手~
二. 需要注意的地方
//step config
var config = {
regs: [
/^\s+|\s+$/g,
/(["'])(?:\\.|[^\\\n])*?\1/g,
/\/(?!\*|span).+\/(?!span)[gim]*/g,
/(\/\/.*|\/\*[\S\s]+?\*\/)/g,
/(\*\s*)(@\w+)(?=\s*)/g,
/\b...\b/g
],
//...
};
这些正则我是分开来写的,主要是为了做上面那个demo,方便单步显示。但是把这些正则分开写是相当不合理的,放在textarea中的是一串没有任何标签的字符串,为了着色,每处理一个正则都会在codes中插入一些标签(我这里用的是span),当我们处理下一个正则的时候就必须得考虑上一步加入的标签,这样会很大程度提高开发难度,最好的做法是把这些正则都放到一坨,然后用|隔开:
var reg = (/^\s+|\s+$/)|(/(["'])(?:\\.|[^\\\n])*?\1/)|(/\/(?!\*|span).+\/(?!span)[gim]*/)|(/(\/\/.*|\/\*[\S\s]+?\*\/)/)|(/(\*\s*)(@\w+)(?=\s*)/)|(/\b(break|continue|do|for|in|function|if|else|return|switch|throw|try|catch|finally|var|while|with|case|new|typeof|instance|delete|void|Object|Array|String|Number|Boolean|Function|RegExp|Date|Math|window|document|navigator|location|true|false|null|undefined|NaN)\b)
这样放的好处是可以直接
codes.replace(reg, function(){
var args = arguments;
//...
});
一次性处理,不用担心插入标签影响最后的结果,因为标签是同一时间插入的,不会有干扰。
代码高亮插件highlight的基本原理也差不多,只不过他的容错机制和代码健壮性这块做的更加完善,我在代码里头加了一个配置文件,
var colors = {
string: "#FFA0A0",
reg: "#16E916",
note: "#888",
tag: "orange",
keywords: "#B0B0FF"
};
按照自己的喜好,也可以加以修改,类似这样的扩展,我们在写代码的时候稍微注意下,多留几个接口就好了。(不过这些活儿干起来都还挺辛苦的~)
没有做成插件,也没这个必要,知道基本原理然后动手实践下就差不多了。
三. 小结
类似很多的前端模板,artTemplate,baiduTemplate等都是对正则表达式的绝伦应用,很值得去看看源码,好好钻研人家都考虑了那些容易出错的点,源码都不长,两三百行。了解一个大概比较容易,但是当自己动手的时候总会发现很多细节问题处理不好,我那上面几个正则就倒弄了半天= =
另外一个配色方案,随便弄的,戳这里SAE/highlight。
正则表达式,用起来还是挺方便的。正则技能,你值得拥有~
玩转正则之highlight高亮的更多相关文章
- highlight高亮
玩转正则之highlight高亮 2013-10-07 05:16 by 靖鸣君, 584 阅读, 3 评论, 收藏, 编辑 程序员在编写代码的时候少不了和字符串以及“查询”打交道,两者的交集中有一个 ...
- 正则&highlight高亮实现(干货)
写完正则表达式以后在浏览器上检测实在是不方便,于是就写了一个JS正则小工具,大大地提高了学习效率.学习之余用正则实现了一个highlight高亮demo,欢迎交流. 什么是正则表达式? 简单的说:正则 ...
- highlight高亮风格
highlight代码高亮的style有很多个,今天闲着没事,突然想看看各个style的效果.列在这里,以后想用的时候看看. ------------------------------------- ...
- js 正则练习之语法高亮
原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先 ...
- 实战JS正则表达式
-正则表达式是一种文本模式的匹配工具. -文章导读: --1.正则对象的属性和方法 --2.字符串对象的方法 --3.使用正则表达式: ---3.1 给字符串加上千分符 ---3.2 字符串中出现次数 ...
- 如何使用 highlight.js 高亮代码
highlight 是一款简单易用的 web 代码高亮插件,可以自动检测编程语言并高亮,兼容各种框架,可以说是十分强大了.下面就简单介绍一下如何使用这款插件. 两种使用方式: 1. 手动选择主题,官网 ...
- elasticsearch高亮之highlight原理
一.highlight简介 highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果: highlight功能通常包 ...
- 代码语法高亮踩坑-原理,问题, PRE元素及htmlentity
语法高亮库基础原理 在研究使用能够在web页面上代码语法高显的解决方案时,发现有很多现成的开源库.比较中意的有prism.js,highlightjs.他们的原理基本上核心就两点: 1. 利用html ...
- 高亮代码 SyntaxHighlighter
SyntaxHighlighter: http://alexgorbatchev.com/SyntaxHighlighter/download/ demo <!DOCTYPE html PUBL ...
随机推荐
- jetbrains产品激活方式(WebStorm,Pycharm有效)
注册时,在打开的License Activation窗口中选择"activation code",在输入框输入下面的注册码 43B4A73YYJ-eyJsaWNlbnNlSWQiO ...
- map阶段动态获取CombineTextInputFormat各输入文件路径
老mr程序中map中conf的map.input.file参数只能获取获取CombineTextInputFormat的第一个输入文件,而新版mr程序则连第一个输入文件也无法获取,这是因为create ...
- JS-sort排序
var arr = [ 'c', 'd', 'a', 'e' ];// arr.sort();// alert( arr );var arr2 = [ 4,3,5,5,76,2,0,8 ];// ar ...
- 【安装mysql数据库】
方法/步骤 请注意上图中选择Custom选项,这样才能修改安装目录. 请注意为了数据安全,不要把mysql安装在系统盘,如C:盘. 可以在其他盘符下,新建两个文件夹,一个存储mysql的文件, ...
- c#闭包(转)
出处:http://www.cnblogs.com/birdwudi/archive/2010/08/20/1804342.html --------------------------------- ...
- AOP实现原理
Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔. 本文来探讨一下AOP实现的原理. 一. 概述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负 ...
- 【分块打表】bzoj1026 [SCOI2009]windy数
#include<cstdio> using namespace std; #define BN 380000 const int table[]={0,79595,158824,2021 ...
- 斯坦福公开课:Statistical Learning中做错的选择题
4.4 R1 In which of the following problems is Case/Control Sampling LEAST likely to make a positive i ...
- #笔记# 移动前端开发之viewport
一般移动设备的浏览器都默认设置了一个 viewport ,并初始定义一个虚拟的layout viewport(布局视口),用于解决早期的页面在手机上显示的问题.下面我们来认识几个与 viewport ...
- C#的对象赋值
例如 Class A { int x = 0; int y = 0; } public void test() { A test1 = new A( ); ...