正则表达式
Regular Expression,是一个字符串,利用【正则】的规则来匹配其他字符串,根据匹配结果可知该串是否匹配规则、匹配的位置等等信息。
Java API
Pattern类
compile
static Pattern compile(String regex); static Pattern compile(String regex, int flags);
编译正则适配模板,返回模板对象,可以选择带匹配标志进行编译。
flags
int flags();
返回适配模板的匹配标志。
matcher
Matcher matcher(CharSequence input);
传入待匹配字符串,返回匹配结果对象matcher。
pattern
String pattern();
返回正则表达式。
split
String[] split(CharSequence input);
按照pattern对象的分隔符分割字符串,例:
String mobile = "13854389438"; Pattern pattern = Pattern.compile("8"); String[] strs = pattern.split(mobile); //strs为{"13","543","943"}
Matcher接口
find
boolean find(); boolean find(int start);
返回是否找到满足正则条件的子串,可以设定输入字符串中开始匹配的起始字符索引。
每当matcher对象调用find()方法,都将下次调用find()方法的起始索引前进至matcher.end()处,可用于循环匹配整个输入字符串,直至尾部。
while(matcher.find()){ System.out.println("start:"+matcher.start()+",end:"+matcher.end()); }
matches
boolean matches();
返回是否整个输入字符串都匹配正则表达式,当且仅当整个输入字符串匹配时返回true。
end
int end();
返回最后匹配字符之后的字符索引(最后匹配的字符索引+1),end方法只有当匹配结果对象matcher不为空且调用了find或matches方法后才能调用。
start
int start();
返回第一个匹配字符的索引,start方法只有当匹配结果对象matcher不为空且调用了find或matches方法后才能调用。
pattern
Pattern pattern();
返回正则适配器模板对象。
replaceAll
String replaceAll(String replacement);
替换输入字符串中匹配正则表达式的全部子串。
replaceFirst
String replaceFirst(String replacement);
替换输入字符串中匹配正则表达式的第一个子串。
典型代码
String text; //匹配文本 String regExp; //正则表达式 //编译正则适配模板 Pattern pattern = Pattern.compile(regExp); //获取匹配结果对象 Matcher matcher = pattern.matcher(text);
Javascript正则
定义
1.直接定义
var regExp = /pattern/{flags};
2.实例化RegExp类对象
var regExp = new RegExp(pattern{, flags});
*区别:
直接定义时,正则用一对正斜杠“//”包住,不需要加引号,具体规则用单个反斜杠“\”表示,如“\d”、"\w"。
用正则表达式的字符串时,因为“\”本身需要转义,需要用双斜杠“\\”进行双重转义,如“\\d”、“\\w”,在Java API中也是如此。
下文例子中的规则,若无明确代码,均以直接定义表示;若要用字符串定义正则表达式,请注意上述区别。
*flags:
g:全局匹配;i:大小写不敏感;m:可跨行匹配。
API
RegExp对象函数:
test
regExp.test(text);
返回匹配结果boolean,类似于Java API中的matches方法,例:
var addr = 'www.google.com'; var regExp = new RegExp('\\w*\\.'); alert(regExp.test(addr)); //true
exec
regExp.exec(text);
依次返回匹配的一个子字符串并移动游标,类似于Java API中的find方法,例:
*若设置了标志位'g',则只会返回第一个匹配的子字符串。while(regExp.exec(str)){ ... }
String对象函数:
match
str.match(regExp);
匹配的子字符串全部返回到数组对象。
var str= new String('peace,pearl,peach'); var regExp = /ea/g; var subStrArr = str.match(regExp);//subStrArr长度为3,内容为ea,ea,ea
search
返回第一个匹配的子字符串的首字符索引。str.search(regExp);
var str= new String('peace,pearl,peach'); var regExp = /ea/g; var index = str.search(regExp);//index为1
replace
替换匹配中的所有子字符串。str.replace(regExp, newStr);
var str = new String('peace,pearl,peach'); var regExp = /ea/g; var newStr = str.replace(regExp,'**');//newStr为'p**ce,p**rl,p**ch'
split
将匹配的子字符串作为分隔符分割输入字符串,返回分割后的字符串数组。str.split(regExp);
var str = new String('peace,pearl,peach'); var regExp = /ea/g; var newStr = str.split(regExp);//newStr的元素依次为"p"、"ce,p"、"rl,p"、"ch"
正则规则
字符
此类规则为单个字符匹配的规则。
边界
\b:边界(以后面紧跟的表达式开始或结尾进行匹配)
\B:非边界(不以后面紧跟的表达式开始或结尾进行匹配)
边界即为逗号、空格等单词分隔符,如下例:
var str = new String('goes go goal good go'); var regExp = /\bgo\b/g; var r; while((r=regExp.exec(str))!=null){ alert(r); //将依次输出两个go }
数字
\d:数字
\D:非数字
常用字符
\w:数字、字母、下划线
\W:非数字、字母、下划线
空格
\s:空格
\S:非空格
特殊字符
转义字符:如\.,\\等,表示要转义的字符
.:除换行外的任意字符
^:起始符,下文细述
$:结束符,下文细述
汉字:[\u4E00-\u9FA5\uF900-\uFA2D]+表示任意多个汉字
自定义字符集合
此类规则适用于用“[]”,“()”包住的单个字符集合的匹配。
(ab)表达式
“()”中可放入多个字符,作为一个整体。
[abc(de)]
匹配其中任意一个字符/表达式匹配即正确匹配,a,b,c,de均可匹配。
^符号
在字符集合中,^表示非,如[^abc]中,不匹配其中任意一个即正确匹配。
区间
[A-F] - A,B,C,D,E,F
[0-9] - 0,1,2,3,4,5,6,7,8,9
匹配区间中任意一个即正确匹配。
多种条件
多种条件并存时或运算,匹配任意一类规则即正确匹配,如[\w\s]匹配常用字符及空格。
匹配次数
此类规则为对字符或字符集合规则的加强,紧跟在字符规则或字符集合规则之后,表示连续出现的次数。
{n}
只出现n次。
{m,n}
出现m到n次。
{m,}
至少出现m次。
*
出现任意次,效果与{0,}相同。
+
至少出现一次,效果与{1,}相同。
?
出现零次或一次,效果与{0,1}相同。
不出现或整体匹配
这类规则规范的内容可不出现,出现则需整体匹配才能正确匹配。
1. (ab){0,1}:
ab可以不出现,不出现时正确匹配;出现则必须满足整体匹配(ab)才能正确匹配。
例:\w{3}(\s{2}){0,1}
两种情况正确匹配:3个普通字符;3个普通字符+2 个空格。
2. (ab|$):
匹配,或以前述条件结束匹配
例:\w{3}(\s{2}|$)
两种情况正确匹配:3个普通字符结束;3个普通字符+两个空格不结束。
起始结束
由^符开头,$符号结尾包住的表达式,格式为/^[正则表达式]$/,需整个字符串匹配才能正确匹配。
也可以只用其中一个,表示以“^”后紧接的或“$”前紧邻的字符/字符集合/表达式开头或结尾的规则。
var text = "abc"; var regExp = /^c/; regExp.exec(text); //返回null,"abc"不以"c"开头 regExp = /c$/; regExp.exec(text); //返回"c","abc"以"c"结尾 regExp = /^\w{3}$/; regExp.exec(text); //返回"abc","abc"以"a"开头、以"c"结尾
二选一
符号为“|”,表示在符号两边的表达式中任选一个匹配则该集合正确匹配。没有“()”限定其范围时将对整个表达式产生作用。
注意:“()”的优先级高于“|”。
例1
regExp = /^b|c.+/; text = "cba"; regExp.exec(text);//以b或(c.+)开头则正确匹配,(c.+)开头匹配,返回"cba"。
例2
regExp = /^b|c.+/; text = "black.com"; regExp.exec(text);//以b或(c.+)开头则正确匹配,b开头匹配,返回"b"
例3
regExp = "/^(b|c).+/"; text = "black.com"; regExp.exec(text);//以b或c开头,b开头匹配,再匹配".+",返回black.com
贪心&非贪心模式
贪心模式与非贪心模式通常出现在"{m,}"匹配时,两者的区别在于,满足最小匹配后,是否立即正确匹配,还是继续扩大匹配。
通常情况下为贪心模式,实现非贪心模式只需要在可能出现上述情况的表达式后面加上"?"。
说起来太绕口,还是直接上例子吧。
var text = "ccccc"; regExp = /c{2,}/; regExp.exec(text); //贪心模式,返回"ccccc" regExp = /c{2,}?; regExp.exec(text); //非贪心模式,返回"cc"
应用实例
纸上谈兵了这么久,是时候上代码了。文本标红
需求:在指定的文本中,对满足正则表达式的所有字符标红、下划线。<body> <div id="mydiv"> 百度,全球最大的中文搜索引擎、最大的中文网站。2000年1月创立于北京中关村。 1999年底,身在美国硅谷的李彦宏看到了中国互联网及中文搜索引擎服务的巨大发展潜力,抱着技术改变世界的梦想,他毅然辞掉硅谷的高薪工作,携搜索引擎专利技术,于2000年1月1日在中关村创建了百度公司。从最初的不足10人发展至今,员工人数超过18000人。如今的百度,已成为中国最受欢迎、影响力最大的中文网站。 百度拥有数千名研发工程师,这是中国乃至全球最为优秀的技术团队,这支队伍掌握着世界上最为先进的搜索引擎技术,使百度成为中国掌握世界尖端科学核心技术的中国高科技企业,也使中国成为美国、俄罗斯、和韩国之外,全球仅有的4个拥有搜索引擎核心技术的国家之一。 从创立之初,百度便将“让人们最平等、便捷地获取信息,找到所求”作为自己的使命,成立以来,公司秉承“以用户为导向”的理念,不断坚持技术创新,致力于为用户提供“简单,可依赖”的互联网搜索产品及服务,其中包括:以网络搜索为主的功能性搜索,以贴吧为主的社区搜索,针对各区域、行业所需的垂直搜索,Mp3搜索,以及门户频道、IM等,全面覆盖了中文网络世界所有的搜索需求,根据第三方权威数据,百度在中国的搜索份额超过80%。 在面对用户的搜索产品不断丰富的同时,百度还创新性地推出了基于搜索的营销推广服务,并成为最受企业青睐的互联网营销推广平台。目前,中国已有数十万家企业使用了百度的搜索推广服务,不断提升企业自身的品牌及运营效率。通过持续的商业模式创新,百度正进一步带动整个互联网行业和中小企业的经济增长,推动社会经济的发展和转型。 为推动中国数百万中小网站的发展,百度借助超大流量的平台优势,联合所有优质的各类网站,建立了世界上最大的网络联盟,使各类企业的搜索推广、品牌营销的价值、覆盖面均大面积提升。与此同时,各网站也在联盟大家庭的互助下,获得最大的生存与发展机会。 </div> <div id="div1"> <input type="text" id="t1" /> <input type="button" id="btn1" onclick="tagRed()" value="标红"/> </div> </body>
<script language="javascript"> function tagRed(){ var text = document.getElementById("mydiv").innerText; var str = document.getElementById("t1").value; var parter = new RegExp(str,"g"); if(!str.length) alert("搜索框文本为空"); else if(text.match(parter)) { text=text.replace(parter,"<font color='red' style='border-bottom:1px solid black'><b>"+str+"</b></font>"); document.getElementById("mydiv").innerHTML=text; } else alert("没有找到指定文本"); } </script>
URL查找
需求:在网页源码内找出所有的URL。注:本例使用了jQuery选择器。<body> <input type="button" id="btn1" /> <div> dwdwadd <a href="http://www.baidu.com">dwd</a> wdwdw <a href="http://www.google.com">dwdw</a> ddwdwdd <a href="http://www.sina.cn"></a> wdwdwd <a href="www.sohu.com">dd</a> wdw </div> <div id="newDiv"></div> </body>
<script src="jquery-1.6.2.js"></script> <script type="text/javascript"> $(function(){ $("#btn1").click(function(){ var html=$("div").html(); var url; var regExp = new RegExp('<a href="((http://)|(https://))?www\.[a-zA-Z0-9]+\.(com|cn|org|edu)">',"g"); var reg = new RegExp("((http://)|(https://))?www\.[a-zA-Z0-9]+\.(com|cn|org)"); while((arr=regExp.exec(html))!=null){ url = arr[0].match(reg); $("#newDiv").append("<p>"+url[0]+"</p>"); } }); }); </script>
表单验证
需求:实时验证输入文本框的内容是否正确。注:本例使用了jQuery选择器、事件、动画等内容。<body> <form method="get/post"> <div> 昵称: <input type="text" id="name" /><span></span> </div> <div> 编号: <input type="text" id="no" /><span></span> </div> <div> 座机: <input type="text" id="tel" /><span></span> </div> <div> 手机: <input type="text" id="mobile" /><span></span> </div> <div> 邮箱: <input type="text" id="email" /><span></span> </div> <div> 身份证:<input type="text" id="idcard" /><span></span> </div> </form> </body>
<script src="jquery-1.6.2.js"></script> <script type="text/javascript"> $(function(){ $("#name").focusout(function(){ var name = $("#name").val(); var regExp = /^([a-zA-Z]{1,6})$|^([\u4e00-\u9fa5]{2,3})$/; if(regExp.test(name)==false){ $("#name").next().html("<font color=red>昵称格式错误</font>"); $("#name").next().hide(); $("#name").next().fadeIn("slow"); } else $("#name").next().fadeOut("slow"); }); $("#no").focusout(function(){ var no = $("#no").val(); var regExp = /^[0-9]{6,6}$/; if(regExp.test(no)==false){ $("#no").next().html("<font color=red>编号格式错误</font>"); $("#no").next() .hide(); $("#no").next().fadeIn("slow"); } else $("#no").next().fadeOut("slow"); }); $("#tel").focusout(function(){ var tel = $("#tel").val(); var regExp = /^0[0-9]{2,3}[0-9]{7,8}$/; if(regExp.test(tel)==false){ $("#tel").next().html("<font color=red>座机格式错误</font>"); $("#tel").next().hide(); $("#tel").next().fadeIn("slow"); } else $("#tel").next().fadeOut("slow"); }); $("#mobile").focusout(function(){ var mobile = $("#mobile").val(); var regExp = /^1[3|5|8][0-9]{9}$/; if(regExp.test(mobile)==false){ $("#mobile").next().html("<font color=red>手机格式错误</font>"); $("#mobile").next() .hide(); $("#mobile").next().fadeIn("slow"); } else $("#mobile").next().fadeOut("slow"); }); $("#email").focusout(function(){ var email = $("#email").val(); var regExp = /^[\w]+@[0-9a-zA-Z]\.[(cn)|(com)|(edu)$](\.(cn)?)$/; if(regExp.test(email)==false){ $("#email").next().html("<font color=red>邮箱格式错误</font>"); $("#email").next() .hide(); $("#email").next().fadeIn("slow"); } else $("#email").next().fadeOut("slow"); }); $("#idcard").focusout(function(){ var idcard = $("#idcard").val(); //1 + 5 + 19xx|20xx(年份) + 0x|1x(月份) + 0x|1-2x|3x(日) + 4 var regExp = new RegExp("^[1-8][0-9]{5}((19[4-9][0-9])|(20[0-1][0-3]))((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))[0-9]{4}$"); if(regExp.test(idcard)==false){ $("#idcard").next().html("<font color=red>身份证格式错误</font>"); $("#idcard").next() .hide(); $("#idcard").next().fadeIn("slow"); } else $("#idcard").next().fadeOut("slow"); }); }) </script>