Java基础(八)常用正则

一、精确查找

假设仅仅查找hi俩字母
很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用**"\bhi\b"。**

\b
匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。

二、正则匹配电话号码

从一个字符串中查找出类似
010-89153248
0431-4512742
(010)-89153248
(0431)-4512742

	 * 	"\D" 非数字字符匹配。等效于 [^0-9]		\\转义
	 * 	"\d" 数字字符匹配。 等效[0-9]
	 * 	"." 匹配任意字符
	 * 	"*" 零次或多次匹配前面的字符或子表达式
	 * 	"?" 零次或多次匹配前面...
	 * 	"+" 一次或多次匹配...
	 * 	"\d{2-5}" 2到5位纯数字

Java对于"\"的处理特殊
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
【其他语言单倍,Java双倍】
所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。

包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码

		System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
		String contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
		String pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";	
		System.out.println(contest);
		boolean isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);
		

包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码

		System.out.println("\n==包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码==");
		contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
		pattern = ".*\\(?0\\d{2}\\)?-\\d{8}.*|.*\\)0\\d{3}\\)?-\\d{7}.*";	
		System.out.println(contest);
		isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);

三、正则分组

分组找出数字电话号码, contest整体算第一组

		System.out.println("==分组找出数字, contest本身算第一组==");
		String contest = "This order was placed for QT3000! OK?";
		String pattern = "(\\D*)(\\d+)(.*)";	
		// 创建Pattern对象, 编译给定的正则表达式
		Pattern ptn = Pattern.compile(pattern);
		// 创建Match对象
		Matcher mtc = ptn.matcher(contest);
		if (mtc.find()) {
			for (int i = 0; i < mtc.groupCount()+1; i++) {
				System.out.println(mtc.group(i));
			}
		}else {
			System.out.println("no match");
		}
		
		System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
		contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
		pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";	
		System.out.println(contest);
		boolean isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);
  • 本文仅供参考,可粘贴至本地IDE测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo {
	public static void main(String[] args) {
		/*
		 * 	"\D" 非数字字符匹配。等效于 [^0-9]		\\转义
		 * 	"\d" 数字字符匹配。 等效[0-9]
		 * 	"." 匹配任意字符
		 * 	"*" 零次或多次匹配前面的字符或子表达式
		 * 	"?" 零次或多次...
		 * 	"+" 一次或多次...
		 * 	"\d{2-5}" 2到5位纯数字
		 * */
		System.out.println("==分组找出数字, contest本身算第一组==");
		String contest = "This order was placed for QT3000! OK?";
		String pattern = "(\\D*)(\\d+)(.*)";	
		// 创建Pattern对象, 编译给定的正则表达式
		Pattern ptn = Pattern.compile(pattern);
		// 创建Match对象
		Matcher mtc = ptn.matcher(contest);
		if (mtc.find()) {
			for (int i = 0; i < mtc.groupCount()+1; i++) {
				System.out.println(mtc.group(i));
			}
		}else {
			System.out.println("no match");
		}
		
		System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
		contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
		pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";	
		System.out.println(contest);
		boolean isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);
		
		System.out.println("\n==包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码==");
		contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
		pattern = ".*\\(?0\\d{2}\\)?-\\d{8}.*|.*\\)0\\d{3}\\)?-\\d{7}.*";	
		System.out.println(contest);
		isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);
		
		System.out.println("\n==============================");
		contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
		pattern = "(\\D*)(\\(0\\d{2}\\)-\\d{8})";	//正则匹配
		System.out.println(contest);
		
		ptn = Pattern.compile(pattern);
		mtc = ptn.matcher(contest);
		if (mtc.find()) {
			for (int i = 0; i < mtc.groupCount()+1; i++) {
				System.out.println(mtc.group(i));
			}

		}else {
			System.out.println("no match");
		}
		

	}
	
	

}

输出结果
在这里插入图片描述

<!--参考网址-->
<a href>https://deerchao.cn/tutorials/regex/regex.htm</a>

四、反义

反义,即需要查找不属于某个能简单定义的字符类的字符。

codecomment
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

例子:
查找<K****>尖括号内K开头单词*代表一个以上字符**

		System.out.println("\n=========查找<K******>尖括号内K开头单词*代表一个以上字符======================");
		contest = "what 452 the f***" + "<dsK>"+"<KalStudio>"+ "(010)-89153248";
		pattern = ".*<K[^>]+>.*";	
		System.out.println(contest);
		isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);
		
  • 本文仅供参考,可粘贴至本地IDE测试

伍、后向引用

后向引用匹配重复单词
go go go或skt skt

  • 首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),
  • 这个单词会被捕获到编号为1的分组中,随后是1个或几个空白符(\s+)
  • 最后为分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
		System.out.println("\n=========匹配重复的单词go go go skt skt==================");
		contest = "what 452 the f***" + ".go go go skt-"+ "(010)-89153248";
		pattern = ".*\\b(\\w+)\\b\\s+\\1\\b.*";
		System.out.println(contest);
		isMatch = Pattern.matches(pattern, contest);
		System.out.println("匹配吗?"+isMatch);

六、加注释

(?#comment)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正则表达式 正则表达式 - 教程 正则表达式 - 简介 正则表达式 - 语法 正则表达式 - 元字符 正则表达式 - 运算符优先级 正则表达式 - 匹配规则 正则表达式 - 示例 正则表达式 - 在线工具 正则表达式 – 简介 正则表达式 – 元字符 正则表达式 - 语法 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 例如: runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。 runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。 colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。 构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值