正则表达式

正则表达式

解释:就是符合一定规则的表达式

         作用:用于专门操作字符串

         特点:用一些特定的符号来表示一些代码操作,这样就简化书写

        

好处:可以简化对字符串的复杂操作

         弊端:符号定义越多,正则越长,阅读性越差

        

具体操作功能:

1, 匹配:String matches()方法

常用:

[^abc] 任何非abc的字符

.              任何字符

\d            代表数字,相当于[0-9]

*              代表0个或多个

+             代表1个或多个

public static void checkQQ() {
		String qq = "123123";
		String qq1 = "021312";
		String qq2 = "123";
		// 正则表达式[]代表内容,{}代表位数
		// 第一位不能为0,从第二位开始为数字,需要4-14位0-9的数字
		String qqRegex = "[1-9][0-9]{4,14}";
		System.out.println(qq.matches(qqRegex));
		System.out.println(qq1.matches(qqRegex));
		System.out.println(qq2.matches(qqRegex));
	}

2,String 的split()切割方法,按正则表达式切割

public class RegexDemo {

	public static void main(String[] args) {
		String str = "heima   lisi   Rhythm zhangsan";
		String reg = " +";
		splitDemo(str, reg);
		System.out.println("------------");
		// 解析地址
		String str1 = "c:\\abc\\haha.txt";
		String reg1 = "\\\\";
//		String reg1 = "(\\)\\1";
		splitDemo(str1, reg1);
		// 按照叠词进行切割如ff
		/*
		 * 第二位需要用到第一位的结果
		 * 定义组
		 * 要重用的部分用()封装起来,组自动编号 (.)\1 \1代表第一组 相当于 ..
		 */
		String str2 = "sdfffsdgrrsdafkka";
		// 第一位匹配任意字符,封装成组,编号1,第二位接着使用第一位的匹配
		String reg2 = "(.)\\1+";
		splitDemo(str2, reg2);
	}

	public static void splitDemo(String str, String reg) {
		// split方法传入的参数是正则表达式,特殊字符应该使用转义字符
		String[] arr = str.split(reg);
		for (String s : arr) {
			System.out.println(s);
		}
	}
}

3,replace()方法,将按正则表达式匹配出的字符替换成指定字符

public class ReplaceDemo {

	// 将字符串中符合正则表达式的字符替换成指定字符
	public static void main(String[] args) {
		String str = "sdfasd12345678";
		// 匹配5个或5个以上的数字
		String reg = "\\d";
		String str1 = "*";
		replaceDemo(str, reg, str1);
		// 将叠词替换成一个,使用$获取前面规则中的组
		String s = "adffffdsdggggsdfsaeeead";
		String reg1 = "(.)\\1+";
		// 获取上面规则的第一组,如ffff,则获得f
		String s1 = "$1";
		replaceDemo(s, reg1, s1);
	}

	public static void replaceDemo(String str, String reg, String str1) {
		str = str.replaceAll(reg, str1);
		System.out.println(str);
	}
}

4,按照规则获取指定子串

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//获取:将字符串中的符合规则的子串取出
/*
 * 操作步骤:
 * 1,将正则表达式封装成对象(Parttern用来将规则封装成对象)
 * 2,让正则对象和要操作的字符串相关联(Matcher匹配器,与要匹配的字符串相关联,然后可以按指定匹配规则匹配)
 * 3,关联后,获取正则匹配引擎
 * 4,通过引擎对符合规则的子串进行操作,比如取出
 * 
 * Matcher类中有个方法String group(),返回由以前匹配操作所匹配的输入子序列
 *	获取匹配后的结果
 * */
public class RegexDemo2 {

	public static void main(String[] args) {
		String str = "01231231";
		String reg = "[1-9]\\d*";
		// 将规则封装成对象
		Pattern p = Pattern.compile(reg);
		// 让正则对象和要作用的字符串相关联,m就是匹配器,将多个操作方式封装到了匹配器中
		Matcher m = p.matcher(str);
		System.out.println(m.matches());
		System.out.println("-------getDemo()");
		getDemo();

	}

	public static void getDemo() {
		String str = "wo yao qu heima";
		// \b单词边界
		String reg = "\\b[a-z]{2}\\b";

		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(str);
		// 将规则作用到字符串上,并进行符合规则的子串查找
		// System.out.println(m.find());
		// 返回符合查找的子串
		// System.out.println(m.group());
		while (m.find()) {
			System.out.println(m.group());
			System.out.println(m.start() + "---" + m.end());
		}
	}
}

练习:

//练习:
//将"我我....我我..我要要要...学..学学...编程",转换成我要学编程
public class RegexTest {

	public static void main(String[] args) {

		String str = "我我....我我..我要要要...学..学学...编程";
		// 去掉点
		str = str.replaceAll("\\.+", "");
		System.out.println(str);
		// 去掉重复的字
		str = str.replaceAll("(.)\\1+", "$1");
		System.out.println(str);
	}
}
对ip和邮件进行匹配:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/*
 * 需求:
 * 将ip地址进行地址端顺序的排序
 * 按照字符串自然顺序,只要让它们每一段都是3位即可
 * 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位
 * 2,将每一段只保留3位,这样,所有的ip地址都是每一段3位
 * "192.168.1.254  102.137.3..13 10.0.0.1  10.2.3.4  2.3.4.6"
 * */
public class RegexTest1 {

	public static void main(String[] args) {
		String ip = "192.168.1.254  102.137.3.13 10.0.0.1  10.2.3.4  2.3.4.6";
		// 匹配每一段的数字,在前面加上2个0
		String reg = "(\\d+)";
		ip = ip.replaceAll(reg, "00$1");
		// 将每一段只保留三位
		ip = ip.replaceAll("0*(\\d{3})", "$1");
		System.out.println(ip);

		String[] arr = ip.split(" +");

		// 排序:方法一,存入到TreeSet集合中
		// TreeSet<String> ts = new TreeSet<String>();
		// for (String s : arr) {
		// ts.add(s);
		// }
		// System.out.println(ts.toString());

		// 方法二:
		// Arrays.sort(arr);
		// for (String s : arr) {
		// System.out.println(s);
		// }
		// 方法三:存储到List集合中
		List<String> list = new ArrayList<String>();
		for (String s : arr) {
			list.add(s);
		}
		Collections.sort(list);
		// 排完序后,去除多余的0
		for (String s : list) {
			s = s.replaceAll("0*(\\d+)", "$1");
			System.out.println(s);
		}
		// System.out.println(list.toString());

		checkMail();
	}

	// 对邮件地址进行校验
	public static void checkMail() {
		String mail = "cloud112@sina.com";
		String reg = "[a-zA-Z0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";// 较为精确的匹配
		// \\w代表[a-zA-Z0-9]
		String reg1 = "\\w+@\\w+(\\.\\w+){1,3}";// 不太精确匹配,后缀名带数字也可以通过
		System.out.println(mail.matches(reg));
	}
}

网页爬虫:

public class RegexTest2 {


	public static void main(String[] args) throws Exception {
		URL url = new URL("http://localhost:8080/myweb/mail.html");
		URLConnection conn = url.openConnection();
		BufferedReader br = new BufferedReader(new InputStreamReader(
				conn.getInputStream()));
		String line = null;
		String mailreg = "\\w+@\\w+(.\\w){1,3}";
		Pattern p = Pattern.compile(mailreg);


		while ((line = br.readLine()) != null) {
			Matcher m = p.matcher(line);
			while (m.find()) {
				System.out.println(m.group());
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值