正则表达式的创建、匹配字符串、转义、字符类、重复以及常用字符
首先是工具推荐:
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');
转义字符
匹配换行符
var str = '1.html 2.css 3.js'; var pattern = / /; console.log(str); console.log(pattern.exec(str));
话说这个换行符好Q
匹配空格
十六进制匹配x开头:
a=x61
b=x62
=x0A
var str = 'a b'; var pattern = /x61x0Ax62/; console.log(pattern.exec(str));
unicode表示:
u0009= 空白符
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));
.代表任意字符,但不能匹配
var str = ' '; 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- none; max-height: none; min- 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- none; max-height: none; min- 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('全是数字!'); }
= 单词边界
var str = '@@@js@@@'; var pattern = /js/; //@也被识别为单词边界 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; } }
和s有什么区别
abc匹配的是"abc"
sabcs匹配的不是"abc", 前后还带空格" abc "
只是匹配字符串开头结尾及空格回车等的位置, 不会匹配空格符本身
如果后面紧跟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 + ' '; } match += '共找到' + total + '处匹配 '; console.log(str); console.log(match);
valueOf:返回一个 Number 对象的基本数字值。
toString():把数字转换为字符串,使用指定的基数。
toLocalString():把数字转换为字符串,使用本地数字格式顺序
var pattern = new RegExp('a\nb') console.log(pattern.toString());//a b console.log(pattern.toLocaleString());//a b console.log(pattern.valueOf() === pattern); //a b
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 js2 js3'; 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-u9fa5w]{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、匹配所有字符
/[wW]/ 或 /[dD]/ 或 /[sS]/ 或 /[^]/
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 + '次');