正则表达式

什么是正则表达式

  • 正则表达式是检查、匹配字符串的表达式
  • 正则表达式是描述规则,主流语言都有良好的支持
  • 字符串校验、查找与替换是正则表达式主要使用场景

匹配方法

  • 只能一个一个字符进行校验和匹配
  • 如果是字符串的校验,一般都会用全字匹配(用^和$包裹)
  • 如果是查找,比如说字符串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);
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值