var http = require('http') var parse = require('url').parse var fs = require('fs') var join = require('path').join
var root = __dirname var server = http.createServer(function(req, res){ var url = parse(req.url) var path = join(root, url.pathname) var stream = fs.createStream(path) stream.on('data',function(chunk){ res.write(chunk) }) stream.on('end',function(){ res.end() }) })
var server = http.createServer((req,res)=>{ var parse = require('url').parse var join = require('path').join var path = join(__dirname,parse(req.url).pathname)
fs.stat(path,(err,stat)=>{ if(err){ if('ENOENT' == err.code){ res.status = 404 res.end('file not found') }else{ res.status = 500 res.end('Internet Server error') } }else{ res.setHeader('Content-Length',stat.size) var stream = fs.createReadStream(stat) stream.pipe(res) stream.on('error',(err)=>{ res.statusCode = 500; res.end('Internet server error') }) } }) })
var d = { v: 'd' } var c = { v: 'c', next: d } var b = { v: 'b', next: c } var a = { v: 'a', next: b } helper(a) console.log(a); console.log(b); console.log(c); console.log(d);
functiontargets(nums, target) { let len = nums.length; if (len === 3) { return nums } nums = nums.sort((a, b) => a - b); let min = Infinity let res
for (var i = 0; i < len - 3; i++) { let basic = nums[i]; let left = i + 1; let right = len - 1; while (left < right) { res = basic + nums[left] + nums[right]; let diff = Math.abs(res - target); if (diff < min) { diff = min res = sum } if (res < target) { left++ } elseif (res > target) { right-- } else { return sum } } } return res }
// 给定 word = "ABCCED", 返回 true // 给定 word = "SEE", 返回 true // 给定 word = "ABCB", 返回 false
functionwordExist(board, word) { var source = word.split(''); if (source.length == 0) returnfalse;
const result = []; const char = source[0]; // 第一步找到所有的线头,也就是所有可能 for (let i = 0; i < board.length; i++) { let charstr = board[i].join(''); while (charstr.includes(char)) { let j = charstr.indexOf(char); // 找到字符所在位置,替换为*,避免下次重复查找 charstr = charstr.slice(0, j) + '*' + charstr.slice(j + 1, board[i].length) if (j !== -1) { result.push(i + '' + j); } } }
if (source.length == 1) return result.length !== 0;
for (let i = 0; i < result.length; i++) { // 根据所有可能,进行递归 let head = result[i].split(''); if (juan(Number(head[0]), Number(head[1]), 1, [result[i]])) { returntrue } }
// 分组 var reg = /(ab)+/g var string = "ababa abbb ababab"; console.log( string.match(regex) ); // => ["abab", "ab", "ababab"]
// 分支结构 var regex = /^I love (JavaScript|Regular Expression)$/; console.log( regex.test("I love JavaScript") ); console.log( regex.test("I love Regular Expression") );
// 将每个单词的首字母转换为大写 functiontitleize(str){ return str.match(/(?:^|\s)\w/g, function(c){ return c.toUpperCase() }) } console.log( titleize('my name is epeli') ); // => "My Name Is Epeli"
// 驼峰化
functiontitleize(str){ return str.match(/[-_\s]+(.)*\w/g, function (c) { return c.toUpperCase() }) }
//字面量方式: var reg = /\d/; //包含一个0-9之间的数字 //实例创建方式 var reg = newRegExp('');
具有特殊意义的元字符
元字符
在//之间具有意义的一些字符
\
转义字符,转译后面字符所代表的含义
^
以某个元字符开始(匹配中是不占位置的)
$
以某个元字符结尾(匹配中是不占位置的)
\n
匹配一个换行符
.
除了\n以外的任意字符
()
分组 把一个大正则本身划分成几个小正则
\d
一个0-9之间的数字 [0-9]
\D
除了0-9之间的数字以外的任何字符
\b
匹配一个边界符
\w
数字、字母、下划线中的任意一个字符 [0-9a-zA-Z_]
\s
匹配一个空白字符,空格、制表符、换页符…
x
y
[xyz]
x、y、z中的一个
[^xyz]
除了三个以外的任何一个字符
[a-z]
a-z之间的任何一个字符
[^a-z]
除了a-z之间的任何一个字符
代表出现次数的量词元字符
量词元字符
含义
*
出现零到多次
+
出现一到多次
?
出现或者不出现
{n}
出现n次
{n,}
出现n到多次
{n,m}
出现n到m次
1 2 3 4 5 6 7 8 9 10 11
var reg = /^\d$/; //只能是一个0-9之间的数字 var reg = /^\d+$/; reg.test('12345'); //true reg.test('1fdgdf2');//false // .元字符 var reg = /^\d.+\d$/; reg.test('1fdgdf2'); //true // () 分组 var reg = /^(\d+)nihao(\d+)$/; reg.test('1213fdgdf546');//false reg.test('1213nihao546');//true
注意
[]
在中括号中出现的所有字符都是代表本身意思的字符
中括号中不识别二位数
1 2
var reg = /^[12-68]$/; //1、2-6或者8中的一个 var reg = /^[\w-]]$/; //数字、字母、下划线、-中的一个
()
改变x|y的默认优先级
/a+/ 表示连续出现 a ,而需要连续出现 ab,则需要 /(ab)+/
在多选分支结构(p1|p2)中,括号的作用是提供了子表达式的所有可能
一般情况下分组的作用是为了引用或者重复出现分组或者分支结构
1 2 3 4 5 6 7 8 9 10
var reg = /^i love (javascript|regular expression)$/ console.log(reg.test('i love javascript')); console.log(reg.test('i love regular expression')); // true // true reg = /(\d{4})-(\d{2})-(\d{2})/ var reg = /^18|19$/; //18、19、181、1819、119、18 var reg = /^(18|19)$/; //18、19x
正则的应用
有效数字的正则 正则、负数、零、小数
1 2 3 4
//"."可以出现也可以不出现,一旦出现,就必须跟一位或多位数字 //最开始可以有+/-也可以没有 //整数部分,一位数可以是0-9之间的一个,多位数不能以0开头 var reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
正则的创建方式
在字面量中,//之间包起来的所有字符都会是元字符,有的有特殊意义,大部分都代表本身含义的普通元字符
1 2 3 4 5 6 7 8 9 10 11
var name = "attacki"; var reg = /^\d+"+name+"\d+$/; reg.test('2019attacki2019'); //false reg.test('2019"""nameeee"2019'); //true //对于这种正则需要用实例创建方式 var reg = newRegExp("^\\d+"+ name + "\\d+","g"); reg.test('2019attacki2019'); //true
var reg = /^[\w.-]+@[0-9a-z-A-Z]+(\.[A-Za-z]{2,4}){1,2}$/;
中国标准真实姓名 2-4位
1
var reg = /^[\ue400=\u9fa5]{2,4}$/
身份证号码
1 2 3
var reg = /^\d{17}(\d|X)$/ //正则的捕获 var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/;
把数字替换为汉字数字
1 2 3 4 5
var str = "20190328"; var ary =['零','一','二','三','四','五','六','七','八','九']; str = str.replace(/\d/g,function(){ return ary[arguments[0]]; })
获取一个字符串中出现次数最多的字符,并且获取出现次数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var str = "jesus love person, he is the son of god"; var obj ={}; str.replace(/\w|,/gi,function(){ var val = arguments[0]; obj[val] >= 1 ? obj[val]++ : obj[val] = 1; }); //获取最多的次数 var maxNum = 0; for(var key in obj){ obj[key] > maxNum ? maxNum = obj[key]:null; } //把所有符合出现maxNum次数的都获取到 var ary = []; for(var key in obj){ obj[key] === maxNum ? ary.push(key):null; } console.log(obj,ary);
模版引擎实现的初步原理
1 2 3 4 5
var str = 'my name is {0} ,my love is {1}'; var ary = ["attacki",'miao']; str = str.replace(/{(\d+)}/g,function(){ return ary[arguments[1]]; });
把字符串中所有单词首字母变为大写
queryUrlParamter
1 2 3 4 5 6 7
var str = 'http://kbs.sports.qq.com/game?mid=1000&cid=1454&app=1.0'; var reg =/([^?=&]+)=([^?=&]+)/; var obj = {}; str.replace(reg,function(){ obj[arguments[1]] = arguments[2]; }) console.log(obj);
时间格式化
1 2 3 4 5 6 7 8 9 10 11 12 13
var str = "2015-5-16 14:53:00"; var reg = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})$/; var ary = []; str.replace(reg,function(){ ary = ([].slice.call(arguments)).slice(1,7); }) //设定好时间格式,把数组中内容替换到指定区域 var resStr = "{0}年{1}月{2}日 {3}时{4}分{5}秒"; str = str.replace(/{(\d+)}/g,function(){ var val = ary[arguments[1]]; val.length === 1 ? val='0'+val:null; return val; })
var reg = /\d+/; var str = "AE86AE"; var res = reg.exec(str); //["86", index: 2, input: "AE86AE", groups: undefined] console.log(reg.lastIndex);// 0 res = reg.exec(str); //["86", index: 2, input: "AE86AE", groups: undefined] console.log(reg.lastIndex);// 0 说明第二次捕获还是从0开始查找的
去除正则的懒惰性,可以在正则后面加修饰符
修饰符
g、i、m
global(g)
全局匹配
ignoreCase(i)
忽略大小写
multiple(m)
多行匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var reg = /\d+/g; var str = "AE8666666AE89AE"; var res = reg.exec(str); console.log(reg.lastIndex);// 9 res = reg.exec(str); console.log(reg.lastIndex);// 13 //把所有捕获内容放在数组当中 var str2 = 'AE86AE87AE89'; var ary = []; var res = reg.exec(str2); while(res){ ary.push(res[0]); res = reg.exec(str2); } console.log(ary);//["86", "87", "89"]