第1章 正则表达式基础语法
1-1 正则表达式的介绍
什么是正规则表达式
◆ 正则表达式是检查,匹配字符串的表达式
◆ 正则表达式是描述规则,主流语言都有良好的支持
◆ 字符串校验,查找与替换是正则表达式主要使用场景
正则表达式测试工具.
1-2 字符范围匹配
示例:
精准匹配字符串“hallo”或者“hello”;正则:h[ae]llo
匹配数字范围(0570-0579);正则:057[0-9]
单选题只允许输入ABCD其中一项;正则:[A-B]
1-3 元字符
示例:
匹配数字(3213.383219);正则:\d\d\d\d.\d\d\d\d\d\d
匹配杭州与宁波座机号码(0571|0574-XXXXXXXX);正则:057[14]-\d\d\d\d\d\d\d\d
匹配18位身份证号;正则:[1234568]\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d[0-9xX]
1-4 多次重复匹配
示例:
验证短信验证码(6位数字);正则:\d{6}
匹配全国座机号(区号3或4位-电话号码7或8位);正则:\d{3,4}-\d{7,8}
匹配英文姓名(例如:James Watson);正则:[A-Z][a-z]+\s[A-Z][a-z]*
1-5 定位匹配
示例:
abb123123ab;正则:^ab.*ab$
1-6 贪婪模式与非贪婪模式
贪婪模式
◆ 在满足条件的情况下尽可能多匹配字符串
◆ 示例:111222333 正则:\d{6,8}
◆ 匹配结果:11122233
非贪婪模式
◆ 在满足条件的情况下尽可能少匹配字符串
◆ 示例:111222333 正则:\d{6,8}?
◆ 匹配结果:111222
示例:
<a href="www.baidu.com">百度</a><a href="www.sina.com">新浪</a>
;
正则:"*"
;匹配:"www.baidu.com">百度</a><a href="www.sina.com"
正则:".*?"
;匹配:"www.baidu.com"
和"www.sina.com"
1-6 表达式分组
◆ 分组将“正则”分组为多个子表达式
◆ 示例:abababcdcdcd
◆ 正则b表达式:(ab){3}(cd){3}
示例:
匹配验证码(4或6位字);正则:(^\d{4}$)|(^\d{6}$)
匹配车牌号(冀A-U888G);正则:^([冀黑粤晋][A-Z])-([A-Z0-9]{5})$
匹配中文或英文姓名(例如:张三或James Watson);正则:(^[\u4e00-\u9fa5]{2,8}$)|^[A-Z][a-z]+\s[A-Z][a-z]*$
第2章 正则表达式应用
2-1 JavaScript表单验证
html代码:
<body>
<form action="#" method="post" id="frmInfo">
<div id="err" style="color:red">
</div>
<div>
姓名:<input id="name" name="name"/>
</div>
<div>
身份证:<input id="idno" name="idno"/>
</div>
<div>
<input type="submit" />
</div>
</form>
<script type="text/javascript">
document.getElementById("frmInfo").onsubmit = function(){
//在JS中定义正则表达式对象只需要在 /正则表达式/
//验证姓名
var regex1 = /^[\u4e00-\u9fa5]{2,8}$/;
//验证身份证
var regex2 = /^[1234568]\d{16}[0-9xX]$/;
var name = document.getElementById("name").value;
var idno = document.getElementById("idno").value;
if(regex1.test(name) == false){//利用正则校验数据,true代表匹配,false代表不匹配
document.getElementById("err").innerHTML = "无效姓名";
return false;
}else if(regex2.test(idno) == false){
document.getElementById("err").innerHTML = "无效身份证号";
return false;
}else{
alert("验证通过,准备提交")
return true;
}
}
</script>
</body>
2-2 Java中Web页面信息提取
html
<body>
<h1>国际主要城市</h1>
<ul>
<li>纽约NewYork</li>
<li>伦敦London</li>
<li>东京Tokyo</li>
<li>巴黎Paris</li>
<li>香港HongKong</li>
<li>休斯顿Houston</li>
<li>广州Guangzhou</li>
<li>里约热内卢RioDEJaneiro</li>
<li>巴拿马城Panamacity</li>
<li>金奈Chennai</li>
</ul>
</body>
class
package com.imooc.regex;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexSample {
public static void main(String[] args) {
StringBuilder content = new StringBuilder();
try {
FileInputStream fis = new FileInputStream("D:/workspace/regex/WebContent/sample.html");//二进制流
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//二进制流转为字符串流
BufferedReader bufferedReader = new BufferedReader(isr);
String lineText = "";
while((lineText = bufferedReader.readLine()) != null) {
// System.out.println(lineText);
content.append(lineText + "\n");
}
bufferedReader.close();
System.out.println(content);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//1.创建正则表达式对象
Pattern p = Pattern.compile("<li>([\\u4e00-\\u9fa5]{2,10})([a-zA-Z]+)</li>");//按“(”,“)”分组
//2.匹配正则表达式
Matcher m = p.matcher(content);
//3.查找匹配的结果
while(m.find()) {
// System.out.println(m.group(0));//group中,0表示完整的字符串, 1表示第一个分组,2表示第二个分组
String chs = m.group(1);
String eng = m.group(2);
System.out.println(chs + "-" + eng);
}
}
}