正则表达式的创建、匹配字符串、转义、字符类、重复以及常用字符
首先是工具推荐:
http://tools.jb51.net/regex/create_reg
http://tools.jb51.net/regex/javascript
i ignoreCase 忽略大小写
g global 全局
m multiline 多行
正则匹配
pattern.test(str)
pattern.exec(str)
修饰符的用法
var pattern = new RegExp('js', 'i');
var pattern = /js/i;
用户输入获取要匹配的文本
var pattern = '/' + userInput + '/i'; var pattern = new RegExp(userInput, 'i');
转义字符 \
匹配换行符 \n
var str = '1.html\n2.css\n3.js';
var pattern = /\n/;
console.log(str);
console.log(pattern.exec(str));

话说这个换行符好Q
匹配空格\t
十六进制匹配\x开头:
a=\x61
b=\x62
\n=\x0A
var str = 'a\nb';
var pattern = /\x61\x0A\x62/;
console.log(pattern.exec(str));
unicode表示:
\u0009=\t 空白符
var str = ' js';
var pattern = /\u0009/;
console.log(pattern.exec(str));
基本汉字unicode范围:\u4e00-\u9fa5
方括号是单个匹配,表示出现j或者s
var str = 'sjavascript';
var pattern = /[js]/;
^在[]里面代表非
^在[]外面代表是为首
var str = 'jscript';
var pattern = /[^js]/;//不是j或者s
console.log(pattern.exec(str));
.代表任意字符,但不能匹配\n
var str = '\n';
var pattern = /./;
console.log(pattern.exec(str));
/[a-zA-Z0-9_]/ /\w/ =数字字母下划线
/[^a-zA-Z0-9_]/ /\W/ =非数字字母下划线
\d 匹配数字
\s 匹配空格
匹配价格
var str = '肯德基豪华午餐:¥15.5!';
var pattern = /\d{1,}\.{0,1}\d{0,}/;
console.log(pattern.exec(str));
+ 匹配一次或更多次的重复
+?匹配一次或更多次的重复,但是在能使整个匹配成功的前提下使用最少的重复
贪婪模式
var str = '<td><p>a</p></td><td><p>b</p></td>';
var pattern = /<td>.*<\/td>/;
console.log(pattern.exec(str));
懒惰模式
var str = '<td><p>a</p></td><td><p>b</p></td>';
var pattern = /<td>.*?<\/td>/;
console.log(pattern.exec(str));
正则表达式的() [] {} 有着不同的意思
() 是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串
(abc)? 表示这一组要么一起出现,要么不出现,出现那则按顺序出现。
(?:abc)表示找到一样abc的一组,但是不记录,不保存到变量中,否则可以通过" role="presentation" style="overflow-wrap: normal; max-width: none; max-height: none; min-width: 0px; min-height: 0px; float: none;" id="MathJax-Element-1-Frame">变量中,否则可以通过变量中,否则可以通过x取第几个括号所匹配到的项。比如(aaa)(bbb)(ccc)(?:ddd)(eee)可以用1获取(aaa)匹配到的内容,而" role="presentation" style="overflow-wrap: normal; max-width: none; max-height: none; min-width: 0px; min-height: 0px; float: none;" id="MathJax-Element-2-Frame">1获取(aaa)匹配到的内容,而1获取(aaa)匹配到的内容,而3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)。
a(?=bbb)顺序环视 表示a后面必须紧跟3个连续的b
(\s*)表示连续空格的字符串
[] 是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*表示空格或者*号]
{}一般是用来匹配的长度。比如\s{3}表示匹配三个空格,\s[1,3]表示匹配1到3个空格
(0-9)匹配'0-9'本身。[0-9]*匹配数字(注意后面有*,可以为空)[0-9]+匹配数字(注意后面有+,不可以为空),
{0-9}写法是错误的
[0-9]{0,9}表示长度为0到9的数字字符串。
\1 = ab
var str = '<p><a>这是一段文字</a></p>';
var pattern = /<([a-zA-Z]+)>(.*?)<\/\1>/;
console.log(pattern.exec(str));
指定匹配位置
^开始 $结尾
匹配全是数字,方法一:
var str = '110119120';
var pattern = /^\d+$/;
console.log(pattern.exec(str));
if (pattern.test(str)) {
console.log('全是数字!');
} else {
console.log('不全是数字!');
}
匹配全是数字,方法二:
var str = '11011a9120';
var pattern = /\D/;
console.log(pattern.exec(str));
if (pattern.test(str)) {
console.log('不全是数字!');
} else {
console.log('全是数字!');
}
\b = 单词边界
var str = '@@@js@@@';
var pattern = /\bjs\b/; //@也被识别为单词边界
console.log(pattern.exec(str));
通过类名获取元素
function getByClassName(className, parentNode) {
if (document.getElementsByClassName) {
return document.getElementsByClassName(className);
} else {
parentNode = parentNode || document;
var nodeList = [];
var allNodes = parentNode.getElementsByTagName('*');
// 正则匹配某个类名
var pattern = new RegExp('\\b' + className + '\\b');
for (var i = 0; i < allNodes.length; i++) {
if (pattern.test(allNodes[i].className)) {
nodeList.push(allNodes[i]);
}
}
// 返回所有匹配到的元素集合
return nodeList;
}
}
\b和\s有什么区别
\babc\b匹配的是"abc"
\sabc\s匹配的不是"abc", 前后还带空格" abc "
\b只是匹配字符串开头结尾及空格回车等的位置, 不会匹配空格符本身
如果后面紧跟script,则匹配java
var str = 'javascript';
var pattern = /java(?=script)/;
console.log(pattern.exec(str));
(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。
(?=pattern) 非获取匹配,正向肯定预查。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。
(?!pattern) 非获取匹配,正向否定预查,例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非获取匹配,反向肯定预查。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
RegExp对象
RegExp实例方法
var pattern = /js/;
var pattern = new RegExp('js');
获取所有的匹配
var str = '1.js 2.js 3.js';
var pattern = /js/g;
var total = 0,
match = '',
result;
while ((result = pattern.exec(str)) != null) {
total++;
match += '第' + total + '个匹配到的是:' + result[0] + ', 它的位置是:' + result.index + '\n';
}
match += '共找到' + total + '处匹配\n';
console.log(str);
console.log(match);
valueOf:返回一个 Number 对象的基本数字值。
toString():把数字转换为字符串,使用指定的基数。
toLocalString():把数字转换为字符串,使用本地数字格式顺序
var pattern = new RegExp('a\\nb')
console.log(pattern.toString());//a\nb
console.log(pattern.toLocaleString());//a\nb
console.log(pattern.valueOf() === pattern); //a\nb
RegExp实例属性
ignoreCase:是一个只读的布尔值,看这个正则表达式是否带有修饰符i
multiline:是一个只读的布尔值,看这个正则表达式是否带有修饰符m
source:是一个只读的字符串,包含正则表达式的文本
lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec( ) 和 test( ) 方法用到
var str = 'js js js';
var pattern = new RegExp('js', 'ig');
console.log(pattern.ignoreCase); //true
console.log(pattern.global); //true
console.log(pattern.multiline); //false
console.log(pattern.source); //js
console.log(pattern.exec(str));
console.log(pattern.lastIndex); //0
console.log(pattern.exec(str));
console.log(pattern.lastIndex); //3
RegExp构造函数属性列表

exec( )接受一个参数时(即要应用模式的字符串),返回包含第一个匹配项信息的数组
包含两个额外的属性
index:表示匹配文本的第一个字符的位置
input:表示存放的为被检索 的字符串string
lastIndex属性,返回匹配内容的最后一个索引位置,也就是下一个匹配的开始位置,注意字符串索引从0开始
lastMatch($&)属性,只读属性,如果没有匹配信息,则该属性的值为空字符串
lastParen属性 只读静态属性,该属性返回在最近一次匹配检测中所得到的最后一个子匹配的值,如果没有子匹配则返回空字符串
leftContext属性 返回匹配内容左侧的字符信息 该属性的初始值为空字符串 ,如果有相应的匹配该属性的值就会改变
var str = 'js js js';
var pattern = /(j)s/;
pattern.exec(str);
console.log(RegExp.input);//js js js
console.log(RegExp.$_); // = input
console.log(RegExp['$_']); // = input
console.log(RegExp.lastMatch); //js
console.log(RegExp['$&']); // = lastMatch
console.log(RegExp.leftContext);
console.log(RegExp['$`']); // = leftContext
console.log(RegExp.rightContext);
console.log(RegExp["$'"]); // = rightContext
console.log(RegExp.lastParen);
console.log(RegExp["$+"]); // = lastParen
String对象中与正则表达式相关的方法
search()
var str = 'html js js';
var pattern = /js/g;
console.log(str.search(pattern));//5
match()
var str = 'js1\njs2\njs3';
var pattern = /^js/mg;
console.log(str);
console.log(str.match(pattern));
split()
var str = 'html , css , js';
var pattern = /\s*,\s*/; // 包括,左右出现空格也能匹配到
console.log(str.split(pattern));
replace()
var str = 'I love js';
var pattern = /(js)/;
document.write(str.replace(pattern, '<strong style="color: red;">$1</strong>'));\
用*屏蔽相关文字
var str = '中国军队和阿扁一起办证';
var pattern = /国军|阿扁|办证/g;
console.log(str.replace(pattern, '*'));
几个文字对应几个*
var str = '中国军队和阿扁一起办证';
var pattern = /国军|阿扁|办证/g;
console.log(str.replace(pattern, function ($0) {
var result = '';
for (var i = 0; i < $0.length; i++) {
result += '*';
}
return result;
}));
常用的正则表达式
1.QQ
全是数字
首位不能为0
最少5位(10000)
目前最多11位?
/^[1-9]\d{4,10}$/
/^[1-9]\d{4,}$/
2.昵称
中、英文、数字以及下划线
2-18位
/^[\u4e00-\u9fa5a-zA-Z0-9_]{2,18}$/
/^[\u4e00-\u9fa5\w]{2,18}$/
3.密码
6-16位
不能用空白字符\s
/^\S{6,16}$/
/^[\w~!@#$%^\[\]]{6,16}$/
4.去除字符串首尾的空白字符
var str = ' Alex ';
var pattern = /^\s+|\s+$/g;
console.log(str.replace(pattern, ''));
函数封装
function trim(str) {
return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
var str = ' Alex ';
console.log('|' + trim(str) + '|');
5.-转驼峰
var str = 'background-color';
var pattern = /-([a-z])/gi;
console.log(str.replace(pattern, function (all, letter) {
return letter.toUpperCase();
}));
函数封装
function toCamelCase(str) {
return str.replace(pattern, function (all, letter) {
return letter.toUpperCase();
})
}
6.匹配HTML标签
var str = '<p class="odd" id="odd">123</p>';
var pattern = /<[^>]+>/g;// <>中间没有再出现>
console.log(str.match(pattern));
7.邮箱
alex@yahoo.com.cn
alex_1@yahoo.com.cn
alex_1.a-sdasd.asdasdas.com@yah-o_o.com.adasdsd.cn
/(?:\w+\.)*\w+@(?:\w+\.)+[a-z]/i
/^[a-z0-9]+(?:[._-][a-z0-9]+)*@[a-z0-9]+(?:[._-][a-z0-9]+)*\.[a-z]{2,4}$/i
8.URL
(协议:\/\/)主机名(:端口号)(/路径)
ftp|http|https|mailto|file:///
/^(https?:\/\/)?([^:\/]+)(:\d+)?(\/.*)?$/
9、匹配主机名
/[^:\/]+/
-www.-imos-oc.casfasf.sadasd.com
/[a-z0-9]|[a-z0-9][-a-z0-9]*[a-z0-9]/i
/^([a-z0-9]\.|[a-z0-9][-a-z0-9]*[a-z0-9]\.)*(com|edu|gov|net|org|[a-z]{2})$/i
/^([a-z0-9]\.|[a-z0-9][-a-z0-9]*[a-z0-9]\.)*([a-z]+)$/i
10、匹配所有字符
/[\w\W]/ 或
/[\d\D]/ 或
/[\s\S]/ 或
/[^]/
11、分别写出匹配正整数、负整数以及既能匹配正整数,也能匹配负整数的正则表达式
提示:1.注意0是整数,不是正整数,也不是负整数
正整数: /[1-9]\d*/
负整数: /-[1-9]\d*/
正整数和负整数:/-?[1-9]\d*/
整数:/0|-?[1-9]\d*/
12、?禁止贪婪模式,请匹配第一个[]以及它里面的内容
var str = 'js[javascript];html[hyper text markup language];css[cascading style sheet];';
var pattern = /\[.*?\]/;
console.log(pattern.exec(str));
13、html标签的属性值既可以放在""中,也可以放在''中,例如<p class="box" id='box'></p>
写出既能匹配""中内容,又能够匹配''中内容的正则表达式
/(["'])[^"']\1/
14、现有字符串'Windows98, WindowsXP, Windows7',请分别写出匹配后面是XP的Windows和后面不是7的Windows的两个正则表达式
提示:1.前瞻性匹配和负向前瞻性匹配
/Windows(?=XP)/
/Windows(?!7)/
15、RegExp对象
匹配字符串'weekend,endfor,end'中所有的end,并分别打印出其中的字母e
提示:1.全局匹配 2.exec循环打印
()包起来的会被存储到结果中
var str = 'weekend,endfor,end';
var pattern =/(e)nd/g;
var result;
while((result = pattern.exec(str)) != null) {
console.log(result[1]);
}
String对象与正则表达式相关的方法
16、找出字符串'110报警120急救119火警114查询'中的所有数字,并打印出来
提示:1.全局匹配 2.match
var str = '110报警120急救119火警114查询';
var pattern =/\d+/g;
console.log(str.match(pattern));
17、找出字符串'asdfgaaaafdgdgaaaadgsxcvcxva'中出现次数最多的字符,并打印出其出现的次数
提示:1.利用数组排序 2.利用引用匹配相同的字符
var str = 'asdfgaaaafdgdgaaaadgsxcvcxva';
var arr = str.split(''); // 转换成数组
str = arr.sort().join(''); // 排序之后再拼成字符串,此时相同的字符紧挨在了一起
var value = ''; // 出现次数最多的字符
var count = 0; // 出现次数
var pattern =/(\w)\1+/g; // 匹配紧挨着的相同字符
str.replace(pattern, function ($0, $1) {
// $0表示匹配到的所有相同字符,$1表示第一个分组匹配的字符,也就是单个字符
if (count < $0.length) {
// 如果$0.length>count,就表示此时匹配到的字符,到目前为止是出现次数最多的
count = $0.length;
value = $1;
}
});
console.log('出现次数最多的字符是:'+value+',共出现'+count + '次');
来源:https://www.cnblogs.com/chenyingying0/p/12148879.html