new RegExp(pattern, attributes);
const url =
'http:www.baidu.com/index?name=username&age=27&pwd=zbc|123@&likes=lol&likes=beautifull girl&$id=main#flag=66';
const password = 'pwd';
const reg = new RegExp(`[?&]${password}=[^?&]+`, 'gi');
const match = url.match(reg);
console.log(match); //["&pwd=zbc|123@"]
const reg2 = new RegExp('\\d{2}$', 'gi');
const number = url.match(reg2);
console.log(number);
构造函数正则方式:
- 转义用双斜杠 \
- 参数是字符串
- 接收变量
常见正则
```javascript 数字:^\d$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9])$ 非零开头的最多带两位小数的数字:^([1-9]\d)+(.\d{1,2})?$ 带1-2位小数的正数或负数:^(-)?\d+.\d{1,2}$ 正数、负数、和小数:^(-)?\d+(.\d+)?$ 有两位小数的正实数:^\d+.\d{2}$ 有1~3位小数的正实数:^\d+.\d{1,3}$ 非零的正整数:^[1-9]\d$ 非零的负整数:^-[1-9]\d*$
汉字:^[\u4e00-\u9fa5]+$ 英文和数字:^[A-Za-z0-9]+$ 长度为3-20的所有字符:^.{3,20}$ 由26个英文字母组成的字符串:^[A-Za-z]+$ 由26个大写英文字母组成的字符串:^[A-Z]+$ 由26个小写英文字母组成的字符串:^[a-z]+$ 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$
Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$ 国内手机号码:^1[34578]{1}\d{9} 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z]\w{4,15}$ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$ 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.[A-Z]).{8,10}$ 日期格式:^\d{4}-\d{1,2}-\d{1,2} 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$ 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始) IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用) IP地址:^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$ 首尾空白字符的正则表达式:^\s|\s$或(^\s)|(\s$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) 空白行的正则表达式:\n\s*\r (可以用来删除空白行) 18位身份证号码(数字、字母x结尾):^((\d{18})|([0-9x]{18})|([0-9X]{18}))$ 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
至少8-16个字符,至少1个大写字母,1个小写字母和1个数字,其他可以是任意字符: /^(?=.[a-z])(?=.[A-Z])(?=.\d)[^]{8,16}$/ 或者: /^(?=.[a-z])(?=.[A-Z])(?=.\d)[\s\S]{8,16}$/ 其中 [\s\S] 中的\s空白符,\S非空白符,所以[\s\S]是任意字符。也可以用 [\d\D]、[\w\W]来表示。 至少8个字符,至少1个大写字母,1个小写字母和1个数字,不能包含特殊字符(非数字字母): ^(?=.[A-Za-z])(?=.\d)[A-Za-z\d]{8,}$ 至少8个字符,至少1个字母,1个数字和1个特殊字符: ^(?=.[A-Za-z])(?=.\d)(?=.[$@$!%#?&])[A-Za-z\d$@$!%#?&]{8,}$ 至少8个字符,至少1个大写字母,1个小写字母和1个数字: ^(?=.[a-z])(?=.[A-Z])(?=.\d)[a-zA-Z\d]{8,}$ 至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符: ^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[$@$!%?&])[A-Za-z\d$@$!%?&]{8,} 最少8个最多十个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符: ^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[$@$!%?&])[A-Za-z\d$@$!%?&]{8,10}
<a name="Ah3uK"></a>
# 正则相关编程
<a name="lPSyc"></a>
## 实现URL解析
```javascript
var url='http:www.baidu.com/index?name=username&age=27&pwd=zbc|123@&likes=lol&likes=beautifull girl&$id=main#flag=66';
function parse(url) {
const obj = {}
const arr = url.match(/[?&][^?&]+=[^?&]+/g)
if (arr) {
arr.forEach((item) => {
const pairs = item.substring(1).split('=')
const key = decodeURIComponent(pairs[0])
const val = decodeURIComponent(pairs[1])
obj[key] = val
})
}
return obj
}
console.log(parse(url))
// {
// $id: "main#flag",
// age: "27",
// likes: "beautifull girl",
// name: "username",
// pwd: "zbc|123@",
// }
function QueryString(url, name) {
var reg = new RegExp('[?&]' + name + '=([^?&]+)'); // new RegExp支持变量
var query = url.match(reg);
return query ? query[1] : null;
}
const pwd = QueryString(url, 'pwd');
console.log(pwd); //username
驼峰
const camelize = str.replace(/(\-(?<word>\w))/g, (...match) => {
console.log(match);
return match[2].toUpperCase();
});
console.log(camlize(str))
function camelize(str) {
return str
.split('-') // my-long-word -> ['my', 'long', 'word']
.map(
(word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)
) // ['my', 'long', 'word'] -> ['my', 'Long', 'Word']
.join(''); // ['my', 'Long', 'Word'] -> myLongWord
}
let str = 'my-long-word';
千分位
String(n).repalce(/(\d)(?=(\d{3})+$)/g,'$1,')
实现Template方法
var str = "您好,<%=name%>。欢迎来到<%=location%>";
function template(str) {
return data => str.replace(/<%=(\w+)%>/g, (match, p) => data[p] || '')
}
var compiled = template(str);
// compiled的输出值为:“您好,张三。欢迎来到网易游戏”
compiled({
name: "张三",
location: "网易游戏"
});
验证HTML标签是否闭合
function checkHtml(data) {
let tag = [
'a',
'abbr',
'address',
'area',
'article',
'aside',
'audio',
'b',
'base',
'bdi',
'bdo',
'blockquote',
'body',
'button',
'canvas',
'caption',
'cite',
'code',
'col',
'colgroup',
'datalist',
'dd',
'del',
'dfn',
'dialog',
'div',
'dl',
'dt',
'em',
'fieldset',
'figcaption',
'figure',
'footer',
'form',
'frame',
'head',
'header',
'hgroup',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'i',
'iframe',
'ins',
'label',
'legend',
'li',
'map',
'mark',
'menu',
'meter',
'nav',
'noscript',
'object',
'ol',
'outgroup',
'option',
'output',
'p',
'pre',
'html',
'progress',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'script',
'section',
'select',
'small',
'span',
'strike',
'strong',
'style',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'textarea',
'tfoot',
'th',
'thead',
'time',
'title',
'tr',
'u',
'ul',
'var',
'video',
'wbr',
];
//清除标签中内容、换行符 <div id="root"></div> => <div></div>
data = data
.replace(/.*?(<.*>).*/g, '$1')
.replace(/[\r\n]/g, '')
.replace(/\s+.*?>/g, '>');
//排除无内容元素
data = data.replace(
/<(img|br|hr|input|link|meta|area|base|col|command|embed|keygen|param|source|track|wbr).*?>/g,
''
);
//清除非标签元素,替换标签为()的形式,例如:<div>替换为左括号(和</div>替换为右括号)
// <div></div> => ()
data = data
.replace(/>.*?</g, '><')
.replace(/<[^\/].*?>/g, '(')
.replace(/<\/.*?[^<]>/g, ')');
//判断()是否为偶数
if (data.length % 2 != 0) {
return false;
}
//循环删除()直至没有()或者为空
while (data.length) {
let temp = data;
let i = 0;
while (i < tag.length) {
let key = '<' + tag[i] + '></' + tag[i] + '>';
data = data.replace(new RegExp(key, 'g'), '');
i++;
}
if (data == temp) {
return false;
}
}
return true;
}
const c1 = checkHtml('<div></div>'); // true
// checkHtml('<div>'); // false
// checkHtml('<br>'); // true
// checkHtml('</img>'); // false
// checkHtml('<img/>'); // true
// checkHtml('<img>'); // true
匹配HTML标签
const str = '<div class="div">51515<p class="odd" id="odd">123</p>123456</div>';
const result = str.match(/<\s*\/?[^>]*>/g);
console.log(result);
// ["<div class="div">", "<p class="odd" id="odd">", "</p>", "</div>"]
//reg = /<\s*\/?\s*[a-zA-z_]([^>]*?["][^"]*["])*[^>"]*>/g;
正则去掉DOM中的内联样式
var str = '<h1 id="text" style="background: #ccc;">测试元素</h1>';
const result = str.replace(/\s+style=\"[^\"]*\"/g, '');
console.log(result); //<h1 id="text">测试元素</h1>
识别正确的邮箱
var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
pattern.test('cn42du@163.com') //true;
pattern.test('ifat3@sina.com.cn') // true;
pattern.test('ifat3.it@163.com') // true;
pattern.test('ifat3_-.@42du.cn') // true;
pattern.test('ifat3@42du.online') // false;
pattern.test('邮箱@42du.cn') // false;
var pattern = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/;
pattern.test('cn42du@163.com') //true;
pattern.test('ifat3@sina.com.cn') // true;
pattern.test('ifat3.it@163.com') // true;
pattern.test('ifat3_-.@42du.cn') // true;
pattern.test('ifat3@42du.online') // true;
pattern.test('邮箱@42du.cn') // true;
验证IP地址
var regIp = /^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$/;
console.log('test 192.168.4.154', regIp.test('192.168.4.154'));