正则表达式(Regular Expression)是一种文本模式,包括普通字符和特殊字符(也称为元字符)。正则表达式使用单个字符串来描述、匹配某个句法规则的字符串
正则使用的场景
验证匹配、查找、替换 验证匹配:可以测试输入字符串是否与某种规则匹配,例如手机号匹配,银行卡号匹配 查找:基于模式匹配从字符串中提取子字符串,这样可以快速查找文档内特定文本内容 替换:可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者使用其他文本替换它
正则表达式基本语法规范
正则表达式的匹配规则是从左到右按规则匹配
示例:^[0-9]+abc$
-
^
为匹配输入字符串的开始位置 -
[0-9]+
匹配多个数字,[0-9]
匹配单个数字,+
匹配一个或者多个 -
abc$
匹配字母abc
并以abc
结尾,$
为匹配输入字符串的结束位置
上述正则表达式所表达的含义:以0-9开头,并以abc结尾,其中0-9可以存在多个,但是必须在abc之前,且结尾必须是abc不能是aabc,abc前面必须是数字
正则表达式符号含义表
符号 | 作用 | 使用方法 | 使用说明 |
---|---|---|---|
[] | 匹配[]中的内容,有且仅有一位满足返回true | [aeiou] | 匹配aeiou中的一个字符串 |
^ | 在[]里面表示非 在[]外面表示匹配输入字符串的开始位置 | [^aeiou] ^[aeiou] | 匹配除了aeiou以外的字符 匹配开始位置为aeiou其中一个的字符串 |
- | 表示一个区间,一般与[]一起使用 | [A-Z] | 匹配字符串是否为大写字母 |
| | 或 | a | b |
$ | 匹配输入字符串的结束位置 | ^[a-z]c$ | 匹配以小写字母开头,c结尾的字符串 |
. | 匹配除换行符(\n、\r)之外的任何单个字符,相当于^[\n\r] | .+ | 匹配不包含\n \r的字符串 |
\s | 匹配所有空白符,包括换行、空格、换页符、换行符等,等价于[\f\n\r\t\v] | \s+ | 匹配字符串中所有的空白符 |
\S | 匹配非空白符,等价于[^\f\n\r\t\v] | [\s\S] | 匹配所有 |
\w | 匹配字母、数字、下划线 | \w | 等价于[A-Za-z0-9_] |
() | 标记一个子表达式的开始和结束位置为一个捕获组,捕获组可以获取供后续使用 | (\d{3})-(\d{3})-(\d{4}) | 匹配123-456-7890类似这样的手机号,捕获组可以获取 |
\cx | 匹配一个控制符,x为一个A-Za-z的字母 | \cM | 匹配一个Control-M或回车符 |
\f | 匹配一个换页符,等价于\x0c或\cL | ||
\n | 匹配一个换行符,等价于\x0a或\cJ | ||
\r | 匹配一个回车符,等价于\x0d或\cM | ||
\t | 匹配一个制表符,等价于\x09或\cI | ||
\v | 匹配一个垂直制表符,等价于\x0b或\cK | ||
\b | 匹配一个单词边界,即字与空格之间的位置 | ||
\B | 匹配非单词边界 | ||
* | 匹配前面的子表达式零次或多次 | zo* | 能匹配z、zo以及zoo,等价于{0,} |
+ | 匹配前面的子表达式一次或多次 | zo+ | 能匹配zo以及zoo,等价于{1,} |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 | do(es)? | 可以匹配do、does、doxy中的do和does,等价于{0,1} |
{n} | n必须为非负整数,匹配n次 | o{2} | 不能匹配Bob中的o,但是能 匹配food中的oo |
{n,} | n必须为非负整数,至少匹配n次 | o{2,} | 不能匹配Bob中的o,但是能匹配food中的oo,foooood中的ooooo |
{n,m} | m和n都必须为非负整数,最少匹配n次,最多匹配m次 | o{1,3} | 能匹配Bob中的o,也能匹配food中的oo,但是foooood只能匹配前三个o |
常用的正则表达式查询表
要求 | 表达式 |
---|---|
整数或者小数 | ^[0-9]+.{0,1}[0-9]{0,2}$ |
只能输入数字 | ^[0-9]*$ |
只能输入n位的数字 | ^\d{n,}$ |
只能输入m~n位的数字 | ^\d{m,n} |
只能输入零和非零开头的的数字 | ^(0 |
只能输入有两位小数的正实数 | ^[0-9]+(.[0-9]{2})?$ |
只能输入有1~3位小数的正实数 | ^[0-9]+(.[0-9]{1,3})?$ |
只能输入非零的正整数 | ^+?[1-9][0-9]*$ |
只能输入非零的负整数 | ^-[1-9][0-9]*$ |
只能输入长度为3的字符 | ^.{3}$ |
只能输入由26个英文字母组成的字符串 | ^[A-Za-z]+$ |
只能输入由26个大写英文字母组成的字符串 | ^[A-Z]+$ |
只能输入由26个小写英文字母组成的字符串 | ^[a-z]+$ |
只能输入由数字和26个英文字母组成的字符串 | ^[A-Za-z0-9]+$ |
只能输入由数字、下划线或26个英文字母组成的字符串 | ^\w+$ |
验证用户密码,格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线 | ^[a-z-A-Z]\w{5,17}$ |
验证是否含有^%&',;=?$"等字符 | [^%&',;=?$"\x22] |
只能输入汉字 | ^[\u4e00-\u9fa5]{0,} |
验证Email地址 | ^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$ |
验证InternetURL | ^http://([w-]+.)+[\w-]+(/[\w-./?%&=]*)?$ |
验证电话号码 | ^((\d{3,4}-) |
验证身份证号(15位或18位数字) | ^\d{15} |
验证一年的12个月,正确格式为:“01"~"09"和"1"~"12” | ^(0?[1-9] |
验证一个月的31天,正确格式为;“01"~"09"和"1"~"31” | ^((0?[1-9]) |
匹配中文字符的正则表达式 | [\u4e00-\u9fa5] |
匹配双字节字符(包括汉字在内) | [^\x00-\xff] |
匹配空行的正则表达式 | \n[\s |
计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) | String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,“aa”).length;} |
匹配html标签的正则表达式 | <(.)>(.)</(.*)> |
匹配首尾空格的正则表达式 | (^\s*) |
匹配2~16位数字、字母、特殊字符的正则表达式 | ^[\x21-\x7e]{2,16} |
JavaScript正则表达式
JavaScript起始位置为
/
结尾位置为/g
-
javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }
-
利用正则表达式分解和转换IP地址:下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
function IP2V(ip) { re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 if(re.test(ip)){ return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 }else{ throw new Error("Not a valid IP address!") } }
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip="10.100.20.168" ip=ip.split(".") alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
-
利用正则表达式限制网页表单里的文本框输入内容:
- 用正则表达式限制只能输入中文:
onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
- 用正则表达式限制只能输入全角字符:
onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
- 用正则表达式限制只能输入数字:
onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
- 用正则表达式限制只能输入中文:
-
用正则表达式限制只能输入数字和英文:
onkeyup="value=value.replace(/[\W]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
-
用正则表达式限制只能输入下划线,数字,字母和汉字
<input onkeyup="value=value.replace(/[^\u4E00-\u9FA5\w]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5\w]/g,''))" value="允许下划线,数字字母和汉字">
-
限制文本框里只能输入数字
<input onkeyup="if(event.keyCode !=37 && event.keyCode != 39) value=value.replace(/\D/g,'');"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/\D/g,''))"> <PIXTEL_MMI_EBOOK_2005>2</PIXTEL_MMI_EBOOK_2005>
<script language="javascript"> if (document.layers)//触发键盘事件 document.captureEvents(Event.KEYPRESS) function xz(thsv,nob){ if(nob=="2"){ window.clipboardData.setData("text","") alert("避免非法字符输入,请勿复制字符"); return false; } if (event.keyCode!=8 && event.keyCode!=16 && event.keyCode!=37 && event.keyCode!=38 && event.keyCode!=39 && event.keyCode!=40){ thsvv=thsv.value;//输入的值 thsvs=thsvv.substring(thsvv.length-1);//输入的最后一个字符 //thsvss=thsvv.substring(0,thsvv.length-1);//去掉最后一个错误字符 if (!thsvs.replace(/[^\u4E00-\u9FA5\w]/g,'') || event.keyCode==189){//正则除去符号和下划线 key thsv.value='请勿输入非法符号 ['+thsvs+']'; alert('请勿输入非法符号 ['+thsvs+']'); thsv.value=""; return false; } } } </script> <input onkeyup="xz(this,1)" onPaste="xz(this,2)" value="">允许数字字母和汉字 <script language="javascript"> <!-- function MaxLength(field,maxlimit){ var j = field.value.replace(/[^\x00-\xff]/g,"**").length; //alert(j); var tempString=field.value; var tt=""; if(j > maxlimit){ for(var i=0;i<maxlimit;i++){ if(tt.replace(/[^\x00-\xff]/g,"**").length < maxlimit) tt = tempString.substr(0,i+1); else break; } if(tt.replace(/[^\x00-\xff]/g,"**").length > maxlimit) tt=tt.substr(0,tt.length-1); field.value = tt; }else{ ; } } </script> 单行文本框控制<br /> <INPUT type="text" id="Text1" name="Text1" onpropertychange="MaxLength(this, 5)"><br /> 多行文本框控制:<br /> <TEXTAREA rows="14" cols="39" id="Textarea1" name="Textarea1" onpropertychange="MaxLength(this, 15)"></TEXTAREA><br /> 控制表单内容只能输入数字,中文.... <script> function test(){ if(document.a.b.value.length>50){ alert("不能超过50个字符!"); document.a.b.focus(); return false; } } </script> <form name=a onsubmit="return test()"> <textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea> <input type="submit" name="Submit" value="check"> </form> 只能是汉字 <input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')"> 只能是英文字符 <script language=javascript> function onlyEng(){ if(!(event.keyCode>=65&&event.keyCode<=90)) event.returnValue=false; } </script> <input onkeydown="onlyEng();"> <input name="coname" type="text" size="50" maxlength="35" class="input2" onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"> 只能是数字 <script language=javascript> function onlyNum(){ if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105))) //考虑小键盘上的数字键 event.returnValue=false; } </script> <input onkeydown="onlyNum();"> 只能是英文字符和数字 <input onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"> 验证为email格式 <SCRIPT LANGUAGE=Javascript RUNAT=Server> function isEmail(strEmail) { if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) return true; else alert("oh"); } </SCRIPT> <input type=text onblur=isEmail(this.value)> 屏蔽关键字(sex , fuck) - 已修改 <script language="JavaScript1.2"> function test() { if((a.b.value.indexOf ("sex") == 0)||(a.b.value.indexOf ("fuck") == 0)){ alert("五讲四美三热爱"); a.b.focus(); return false;} } </script> <form name=a onsubmit="return test()"> <input type=text name=b> <input type="submit" name="Submit" value="check"> </form>
JAVA正则表达式语法
正则表达式匹配
要求 | 语法 |
---|---|
匹配空行 | /^\s*$/ |
验证由两位数字、一个连字符再加 5 位数字组成的 ID 号 | /\d{2}-\d{5}/ |
匹配 HTML 标记 | /<\s*(\S+)(\s[^>])?>[\s\S]<\s*/\1\s*>/ |
匹配文件名是否含有/~# %等特殊字符 | ^[^~#%&*\x5c/ |
Java的正则匹配与常规的正则匹配有一些小的区别
/
表示起始位置,/
表示结束位置
Pattern p_script = Pattern.compile("正则表达式", Pattern.CASE_INSENSITIVE);
Matcher m_script = p_script.matcher(content);
while (m_script.find()) {
// 找到匹配内容,进行后续事情
String strAid = m_script.group(1);
// ...
}
Pattern类:正则表达式的编译表示,
Matcher类:
PatternSyntaxException: