什么是正则表达式
- 正则表达式是检查、匹配字符串的表达式
- 正则表达式是描述规则,主流语言都有良好的支持
- 字符串校验、查找与替换是正则表达式主要使用场景
匹配方法
- 只能一个一个字符进行校验和匹配
- 如果是字符串的校验,一般都会用全字匹配(用^和$包裹)
- 如果是查找,比如说字符串
acacacacac
,正则表达式为acac
,则会匹配到两个acac
(第一个是0-3,第二个是4-7) - 匹配单个中文可以用
[\u4e00-\u9fa5]
字符范围匹配
如果要用中括号匹配连字符-
,可以放在中括号的开始或者结尾[-a-z]
[a-z-]
,亦或是用转义符\-
。/[A-Za-z0-9]/
表示匹配大小写字母、数字其中一种
元字符
通过某种特殊的表达形式,单指某一类字符
多次重复匹配
数量只能描述单个字符或一个分组,不能说fv{5}
是fv
出现了五次,应该使用分组来表示fv
出现5次^(fv){5}$
(全字匹配)
定位匹配
整个字符串的开头、结尾或(开头和结尾)。如果要匹配$
,则要使用\$
正则表达式的贪婪模式和非贪婪模式
贪婪模式(默认就是贪婪模式)
-
在满足条件的情况下尽可能多匹配到字符串
比如说字符串是:
111222333
正则表达式为:
\d{6,8}
那么匹配的时候会尽量多匹配到字符(所以匹配到了8位数字)
11122233
非贪婪模式
-
在满足条件的情况下尽可能少匹配到字符串(?写在描述数量的后面)
比如说字符串是:
111222333
正则表达式为:
\d{6,8}?
那么匹配的时候会尽量少匹配到字符(所以匹配到了6位数字)
111222
表达式分组
-
分组将”正则“分组为多个表达式
比如说字符串:
abababcdcdcd
正则表达式可以写为:
(ab){3}(cd){3}
一个括号代表一个分组,
(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
JavaScript表单验证
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="#" id="frm">
<div>
名字:<input type="text" name="name" id="name">
</div>
<div>
省份证号:<input type="text" name="idno" id="idno">
</div>
<input type="submit" value="提交">
</form>
<script type="text/javascript">
document.getElementById("frm").onsubmit=function(){
//在js中定义正则表达式对象只需用 /正则表达式/
var regexname=/^[\u4e00-\u9fa5]{2,8}$/;
var regexidno=/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
var name=document.getElementById("name").value;
var idno=document.getElementById("idno").value;
//利用正则表达式对象的test()方法校验数据,true代表匹配成功,false表示失败
if(!regexname.test(name)){
alert("请输入合法的名字");
//如果返回false则表单不会提交
return false;
}else if(!regexidno.test(idno)){
alert("请输入合法的身份证号");
return false;
}else{
return true;
}
}
</script>
</body>
</html>
-
HTML5提供了校验表单的属性
Country code: <input type="text" name="country_code" pattern="[A-z]{3}" title="Three letter country code" />
Java中Web页面信息的提取
<!DOCTYPEhtml>
<html>
<head>
<meta charset="UTF-8">
<title>国际主要城市</title>
</head>
<body>
<h1>国际主要城市</h1>
<ul>
<li>纽约NewYork</li>
<li>伦敦London</li>
<li>东京Tokyo</li>
<li>巴黎Paris</li>
<li>香港HongKong</li>
<li>新加坡Singapore</li>
<li>悉尼Sydney</li>
<li>米兰Milano</li>
<li>上海Shanghai</li>
<li>北京Beijing</li>
<li>马德里Madrid</li>
<li>莫斯科Moscow</li>
<li>首尔Seoul</li>
<li>曼谷Bangkok</li>
<li>多伦多Toronto</li>
<li>布鲁塞尔Brussels</li>
<li>芝加哥Chicago</li>
<li>吉隆坡KualaLumpur</li>
<li>孟买Mumbai</li>
<li>华沙Warsaw</li>
</ul>
</body>
</html>
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);
//用于保存从HTML页面提取出来的所有字符
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.创建正则表达式对象
//传入正则表达式字符串,在正则表达式中采用分组,是为了后面对中文和英文分开提取
//中文的匹配为[\u4e00-\u9fa5],因为传入的是正则表达式的字符串,所以要进行转译,添加\
Pattern p = Pattern.compile("<li>([\\u4e00-\\u9fa5]{2,10})([a-zA-Z]+)</li>");
//2.匹配正则表达式(返回给一个匹配器)
//参数是要匹配的字符串
Matcher m = p.matcher(content);
//3.查找匹配的结果
//如果匹配成功find()返回true,如果有多处匹配则要用到循环
while(m.find()) {
//得到每一次完整的匹配信息
System.out.println(m.group(0));
//得到每一次匹配的第一个分组中的信息
String chs = m.group(1);
//得到每一次匹配的第二个分组中的信息
String eng = m.group(2);
System.out.println(chs + "-" + eng);
}
}
}