layout | title | tags |
---|---|---|
post |
正则在手,天下我有 |
regexp |
// 说明 这些正则里充斥了大量 (?:) 这货, // 简单费磨叽句话: ()代表分组,就是多字符匹配,团结的像一个似的. // 分组还有个作用:捕获. 就是说()匹配的内容, 会给个号码然后将其缓存起来, 后面的表达式语句能使用号码引用匹配到的文本(见号如见匹配文本) // 像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;