Skip to content

Latest commit

 

History

History
234 lines (154 loc) · 7.14 KB

2014-06-17-正则在手,天下我有.md

File metadata and controls

234 lines (154 loc) · 7.14 KB
layout title tags
post
正则在手,天下我有
regexp

jQuery 是个啥? jQuery是个javascript的封装库. jQuery 靠啥牛逼? 靠正则.

// 说明 这些正则里充斥了大量 (?:) 这货, // 简单费磨叽句话: ()代表分组,就是多字符匹配,团结的像一个似的. // 分组还有个作用:捕获. 就是说()匹配的内容, 会给个号码然后将其缓存起来, 后面的表达式语句能使用号码引用匹配到的文本(见号如见匹配文本) // 像oracle里的 with

// 再说点题外话:关于行结束符 // mac: r 回车 // unix: n 换行 // window: rn 回车换行 // 换行符起源于机械打字机,当打字机的笔尖走到行末时,有两个动作, // 回车,return到行首,接着n,换到下一行

// 三分组,外层为第一层分组, 因采用(?:) 匹配但不捕获,没有分组好, 所有最终拿到手的只有两组分组. // 最外层分组匹配的是选择器selector,可为html标签,或id选择器. // 分组1匹配标签名,标签内的字符串,不带左右尖括号. // 分组2匹配id选择器名,不带#号.

var quickExpr = /^(?:^#<(<wW+>)^>$|#(w-*)$)/

// 匹配任意非空字符,空格,tab,回车等统统不匹配 var rnotwhite = /S/

// Used for trimming whitespace // 匹配以空白符开始的行 var trimLeft = /^s+/ // 匹配以空白符结尾的行,阿里的笔试题就有这个 var trimRight = /s+$/

// Match a standalone tag // w 匹配数字字母下划线 // 第二个分组匹配不捕获(它调用了第一组的捕获内容)没了分组号,最终只剩第一个分组号,用于匹配标签名 // 这货匹配一组单独标签,闭合单标签或闭合双标签 var rsingleTag = /^<(w+)s*/?>(?:</1>)?$/

// JSON RegExp

// 匹配任意多个 ],:和空格,干啥使得后面再说 var rvalidchars = /^[],:s](#)*$/

// var rvalidescape = /\(?:"\/bfnrt|u0-9a-fA-F4)/g

// 匹配JSON合理的取值 // "^"\nr" 匹配被双引号包着的字符 双引号抱着的内容不能有(双引号,换行符,回车符,转义符) // 也匹配为 true或false或null的值 // -?d+(?:.d)?(?:eE+-?d+) // 可匹配负值,可匹配带小数的,还匹配科学计数法 // 强大! var rvalidtokens = /"^"\nr"|true|false|null|-?d+(?:.d)?(?:eE+-?d+)?/g

// 匹配 [  或 , [ 或 :  // (?:^|:|,) 这货差点让我看走眼 匹配三个 空或:或, // ^ 匹配字符串的开始,紧接着就是或,所以它匹配空 // 这个表达式看起来像 json的左括号 var rvalidbraces = /(?:^|:|,)(?:s*[)+/g

// Useragent RegExp // UserAgent 就是浏览器的洋名

// webkit/ab.c var rwebkit = /(webkit) /(w.+)/

var ropera = /(opera)(?:.*version)? /(w.+)/,

var rmsie = /(msie) (w.+)/,

// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:29.0) Gecko/20100101 Firefox/29.0" var rmozilla = /(mozilla)(?:.*? rv:(w.+))?/,

// Matches dashed string for camelizing var rdashAlpha = /-(a-z|0-9)/ig

// 微软前缀 var rmsPrefix = /^-ms-/,

// 匹配大括号和中括号,中间内容不限 var rbrace = /^(?:{.}|[.])$/

var rmultiDash = /(A-Z)/g

// 匹配换行,回车,制表符 var rclass = /ntr/g

// 匹配空格 var rspace = /s+/

//匹配回车 var rreturn = /r/g,

var rtype = /^(?:button|input)$/i,

// 能被focus的, 即按tab可focus的,涨姿势了 var rfocusable = /^(?:button|input|object|select|textarea)$/i,

var rclickable = /^a(?:rea)?$/i,

// 取值为布尔值的 var rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,

// form元素 var rformElems = /^(?:textarea|input|select)$/i,

var rtypenamespace = /^(^.*)?(?:.(.+))?$/

var rhoverHack = /bhover(.S+)?b/,

var rkeyEvent = /^key/,

// 点击事件 mouse或contextmenu再无前缀,click可有 var rmouseEvent = /^(?:mouse|contextmenu)|click/

var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,

var rquickIs = /^(w*)(?:#(w-+))?(?:.(w-+))?$/,

// 这里是sezzle中的核心,待续 // 大块儿头 var chunker = /((?:((?:(^()+)|^()+)+)|[(?:[^[]]|'"^'"'"|^[]'"+)+]|\.|^ >+,([\+)+|>+)(s*,s*)?((?:.|r|n)*)/g,

ID: /#((?:wu00c0-uFFFF-|\.)+)/,

CLASS: /.((?:wu00c0-uFFFF-|\.)+)/, NAME: /[name='"((?:wu00c0-uFFFF-|\.)+)'"]/, ATTR: /[s*((?:wu00c0-uFFFF-|\.)+)s*(?:(S?=)s*(?:('")(.?)3|(#?(?:wu00c0-uFFFF-|\.))|)|)s*]/, TAG: /^((?:wu00c0-uFFFF*-|\.)+)/, CHILD: /:(only|nth|last|first)-child(?:(s*(even|odd|(?:+-?d+|(?:+-?d*)?ns*(?:+-sd+)?))s))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=^-|$)/, PSEUDO: /:((?:wu00c0-uFFFF-|\.)+)(?:(('"?)((?:(^)+)|^()*)+)2))?/

var runtil = /Until$/

var rparentsprev = /^(?:parents|prevUntil|prevAll)/,

// Note: This RegExp should be improved, or likely pulled from Sizzle var rmultiselector = /,/

var isSimple = /^.[^:#.,*$/,

// h5标签全家福
var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video";

// 匹配jQuery的"uuid" var rinlinejQuery = / jQueryd+="(?:d+|null)"/g

var rleadingWhitespace = /^s+/

// good: (?!exp) 匹配后面跟的不是exp的位置 var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)((w:+)^>*)/>/ig

var rtagName = /<(w:+)/ var rtbody = /<tbody/i var rhtml = /<|&#?w+;/ // < 或者   &#xxx; var rnoInnerhtml = /<(?:script|style)/i

// html代码中不能含有这些标签,加入dom缓存 var rnocache = /<(?:script|object|embed|option|style)/i,

// checked="checked" or checked var rchecked = /checkeds*(?:^=|=s*.checked.)/i

var rscriptType = //(java|ecma)script/i var rcleanScript = /^s*<!(?:[CDATA[|--)/

var var ralpha = /alpha(^))/i var ropacity = /opacity=(^))/

// fixed for IE9, see #8346 var rupper = /(A-Z|^ms)/g var rnumpx = /^-?d+(?:px)?$/i

var rnum = /^-?d/, var rrelNum = /^(-+)=(-+.de+)/,

// 编码后的空格 var r20 = /%20/g, var rbracket = /[]$/,

// 表示 r,n 或 rn var rCRLF = /r?n/g,

var rhash = /#.*$/,

// IE leaves an r character at EOL var rheaders = /^(.?): t(^rn*)r?$/mg,

// 可输入的标签 var rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i

// #7653, #8125, #8152: local protocol detection // 访问本地资源时,浏览器地址栏可使用的schema var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/

var rnoContent = /^(?:GET|HEAD)$/

//匹配 // var rprotocol = /^/// var rquery = /?/

// b代表单词的开头或结尾,也就是单词的分界处 var rscript = /<scriptb^<(?:(?!</script>)<^<)*</script>/gi

var rselectTextarea = /^(?:select|textarea)/i var rspacesAjax = /s+/ var rts = /(?&)_=^&/ var rurl = /^(w+.-+:)(?://(^/?#:)(?(d+))?)?/

var rfxtypes = /^(?:toggle|show|hide)$/ var rfxnum = /^(+-=)?(d+.-+)(a-z%*)$/i

var rtable = /^t(?:able|d|h)$/i var rroot = /^(?:body|html)$/i;