Skip to content

Latest commit

 

History

History
104 lines (79 loc) · 2.72 KB

正则练习.md

File metadata and controls

104 lines (79 loc) · 2.72 KB

正则练习

基础知识

String RegExp 方法

String.prototype.search(regexp)
String.prototype.match(regexp)
String.prototype.replace(regexp|substr, newSubStr|function)
String.prototype.split([separator[, limit]])   // 字符串分割成字符串数组

RegExp.prototype.exec(str)  // 成功返回数组,失败返回 null
RegExp.prototype.test(str)  // 测试检索,匹配返回 true,失败返回 false
RegExp.prototype.toString()

RegExp 属性

// 转义字符
* . ? + $ ^ [ ] ( ) { } | \ /
\d === [0-9]
\D === [^0-9]
\s === [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]  Unicode 空白符
\S === [^...]
\w === [0-9A-Z_a-z]
\b 字边界

? === {0,1}   * === {0,}   + === {1,}
\1 第一个捕获组

RegExp.$1-$9
RegExp.input ($_)
RegExp.lastMatch ($&)
RegExp.lastParen ($+)
RegExp.leftContext ($`)
RegExp.rightContext ($')

RegExp.prototype.source     // 返回正则对象的模式文本字符串,不包括flags和斜杠
RegExp.prototype.flags      // 返回一个字符串,由gimuy组成
RegExp.prototype.lastIndex  // g 才生效

// 返回布尔值
RegExp.prototype.global      // g
RegExp.prototype.ignoreCase  // i
RegExp.prototype.multiline   // m (影响 ^ 和 $ 的行为)
RegExp.prototype.unicode     // u
RegExp.prototype.sticky      // y

捕获组与非捕获组的区别

  1. 捕获组:(...) 作为子匹配返回。
  2. 非捕获组:
    1. (?=pattern) 会作为匹配校验,但不会出现在匹配结果字符串里面
    2. (?:pattern) 会作为匹配校验,并出现在匹配结果字符里面
var data = 'windows 98 is ok';

data.match(/windows (?=\d+)/); // ["windows "]
data.match(/windows (?:\d+)/); // ["windows 98"]
data.match(/windows (\d+)/); // ["windows 98", "98"]

匹配 URI

var url = 'http://www.baidu.com:80/articles/js?wd=js&rsv_spt=1#fragment';

var parse_url = /^(?:([a-zA-Z]+:))?(\/{0,3})([\w.\-]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;

var results = parse_url.exec(url);

var names = ['href', 'protocol', 'slash', 'hostname', 'port', 'pathname', 'search', 'hash'];

var blanks = '        ';

for(let i =0, j = names.length; i < j; i++){
    console.log(`${names[i]}: ${blanks.slice(names[i].length)} ${results[i]}`);
}

输出:
href:        http://www.baidu.com:80/articles/js?wd=js&rsv_spt=1#fragment
protocol:    http:
slash:       //
hostname:    www.baidu.com
port:        80
host:        www.baidu.com:80
pathname:    /articles/js
search:      wd=js&rsv_spt=1
hash:        fragment