在编程中,有时你会发现正则表达式是一个很有用的工具,这篇文章让我和大家一起来理解和使用正则表达式。
首先我们来看看正则表达式的基础知识,包括点符号(.),方括号([]),或(|),匹配次数符(*,+,?,{n},{m,n}),非(^),空白符(\s)和其它常用字符等。
点符号,.号可以匹配所有字符,包括空格号,例如d.y,就可以匹配day,d@y,d!y,d y等等。
方括号,[]中可以加入要匹配的字符,例如a[abcdef]c,这个例子只能匹配aac,abc,acc,adc,aec,afc。就相当于从中括号中选择一个字符进行匹配,不能匹配aaac,aabcc等。
或号,|表示两者之一,例如a(a|b|aa|bb)c,这个可以匹配的结果是aac,aaac,abbc。与括号不同的或号可以是多个字符,方括号中只能包含一个字符。
匹配次数符,*表示0次或多次,+表示1次或多次,?表示0次或1次,{n}表示n次,{m, n}表示m到n次。例a*,a+,a?,a{3},a{2,5}。
空白符,\s表示一个空格字符,但在匹配时要这样"\\s",转义,不然eclipse会报错。
非,^表示否的意思,例如^a,表示这个字符不能为a。
其他常用符号,\d,\D,,\w,\W,\s,\S等。\d表示[0-9],\D表示[^0-9],\w表示[A-Z0-9],\W表示[^A-Z0-9],\s表示[\t\n\r\f],\S表示[^\t\n\r\f]。这里要说明的点是"^\\d"与"\\d"匹配的结果是一样的,说明^字符在这里没有起到作用。
在java中使用正则表达式的几种方法:
boolean b = "abcd".mathes("[a-z]+");
boolean b = Pattern.matches("[a-z]+", "abcd");
Pattern p = Pattern.conpile("[a-z]+");
Matcher m = p.matches("abcd");
boolean b = m.matches();
以上三种方法可以给我们使用,可以根据具体情况选择适合的方式使用。
下面我们我看看具体的一些实例:
匹配IP地址,\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
查找html中对应条件的字符串, Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
if(matcher.find())
System.out.println(matcher.group(1));
打印结果为:index.html
去除html标记,Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
String string = matcher.replaceAll("");
System.out.println(string);
打印结果为:主页
匹配是否为邮箱地址, String str="[email protected]";
Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
打印结果为:true
把我们要匹配的字符替换成我们想要的字符,
Pattern pattern = Pattern.compile("我是正则表达式");
Matcher matcher = pattern.matcher("我是正则表达式 Hello World!我是正则表达式 ");
System.out.println(matcher.replaceAll("我被替换了"));
打印结果为:我被替换了 Hello World! 我被替换了
Pattern pattern = Pattern.compile("我是正则表达式");
Matcher matcher = pattern.matcher("我是正则表达式 Hello World,我是正则表达式");
System.out.println(matcher.replaceFirst("我被替换了"));
打印结果为:我被替换了 Hello World,我是正则表达式
等等这些只是一些简单的用法,还有很多用法以后补充吧。
身份证正则:
//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)
最新手机号码正则表达式:
var tel = $("#telNo").val(); //获取手机号
var telReg = !!tel.match(/^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/);
//如果手机号码不能通过验证
if(telReg == false){
}
其他
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
提取信息中的中国手机号码:(86)*0*13\d{9}
提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
提取信息中的中国身份证号码:\d{18}|\d{15}
提取信息中的整数:\d+
提取信息中的浮点数(即小数):(-?\d*)\.?\d+
提取信息中的任何数字 :(-?\d*)(\.\d+)?
提取信息中的中文字符串:[\u4e00-\u9fa5]*
提取信息中的双字节字符串 (汉字):[^\x00-\xff]*
使用:
test()方法在字符串中查找是否存在指定的正则表达式,并返回布尔值,如果存在则返回true,否则返回false。
var pattern = new RegExp('Box','i');
var str = 'box';
alert(pattern.test(str)); //true
var pattern = /Box/i;
var str = 'box';
alert(pattern.test(str)); //true
var pattern = /Box/i;
var str = 'This is a box';
alert(pattern.test(str)); //true
+_+ @ a little a day