正则表达式

目录

一、重复次数匹配

大括号的其他用法

参考代码

几个特殊的符号

二、字符区间匹配

参考代码

区间的其他写法

三、分组

参考代码

四、字符的转义 

参考代码

更多注意事项 

五、几种特殊用法

测试代码

六、查找

代码

贪心模式 

正则表达式的编译

七、获取分组 


一、重复次数匹配

有以下字符串:

Huawei

Huaawei

Huaaawei

他们有什么规则呢? Hua{1,3}wei

其中,{1,3}表示前面的字符重复1到3次(1-3)

大括号的其他用法

{m,n} 最少m次,最多n次

{m,} 最少m次

{,n} 最多n次

{m} 刚好m次

参考代码

使用java.util.regex.*下的API来实现正则表达式

String content = "Huaawei";
		
String regex = "Hua{1,3}wei";
		
boolean isMatch = Pattern.matches(regex, content);

其中,regex为正则表达式(规则描述)

几个特殊的符号

* 表示0次、1次、或N次,相当于{0,}

+ 表示1次、或N次,相当于{1,}

? 表示0次、或1次,相当于{0,1}

例如,Hua+wei相当于Hua{1,}wei 

举几个例子

Huawei

        与 Hua*wei           匹配
Huwei          与Hua?wei           匹配
Huaawei        与Hua?wei           不匹配
Huaawei        与Hua{3}wei           不匹配


 

二、字符区间匹配

有以下字符串:

穆宁雪

穆小雪

穆雪雪

用正则表达式来描述:穆[宁小雪]雪

其中,中括号[]表示区间内的任意一个字符

参考代码

	public static void main(String[] args)
	{
		String content = "穆宁雪";
		
		String regex = "穆[宁小雪]雪";
		
		boolean isMatch = Pattern.matches(regex, content);
		
		System.out.println("匹配: " + isMatch);
	}

 注意:正则表达式内不要加多余字符,包括空格

区间的其他写法

[a-xA-Z] 所有的字母

[0-9] 所有的数字

[0-9a-zA-Z_] 数字、字母、下划线

[^abc] 中括号内以^开头,表示“非”

中括号通常与大括号连用,例如:要求用户设定一个6-12位的密码。密码可以为数字、字母、下划线

用正则表达式来描述就是[0-9a-zA-Z_]{6,12}

注意:正则的表达式的书写需要特别小心。别加多余的东西。而且一般需要多次尝试........................

三、分组

在正则表达式中,小括号表示一个分组

例如:

ChinaGreat

ChinanaGreat

ChinananaGreat

用正则表达式可以表示为:Chi(na)+Great

参考代码

	public static void main(String[] args)
	{
		String content = "ChinananaGreat";
		
		String regex = "Chi(na)+Great";
		
		boolean isMatch = Pattern.matches(regex, content);
		
		System.out.println("匹配: " + isMatch);
	}

四、字符的转义 

考虑以下手机号的格式:

+86-13810012345

+86-13600120389

+86-13412338088

如何用正则表达式描述这样的规则呢?

参考代码

	public static void main(String[] args)
	{
		String content = "+86-13810012345";
		
		String regex = "+86-1[0-9]{10}";
		
		boolean isMatch = Pattern.matches(regex, content);
		
		System.out.println("匹配: " + isMatch);
	}

可知,+在正则表达式中有特殊的含义:前面的{1,n}

在正则表达式中,如果想把特殊字符作为普通字符使用,则需要转义。

例如:\+86-1[0-9]{10}  (\+转义后代表"+"号)

写成Java代码:"\\+ 86-1[0-9]{10}"

注意:此处有两个层次的转义:一层是Java对字符串的转义,另一层是正则表达式对特殊字符的转义(意思就是反斜杠本身也要转义)

	public static void main(String[] args)
	{
		String content = "+86-13810012345";
		
		String regex = "\\+86-1[0-9]{10}";
		
		boolean isMatch = Pattern.matches(regex, content);
		
		System.out.println("匹配: " + isMatch);
	}

 

哪些字符需要转义?

*  +  ?  {}  []  ()  . ^  $  \ (\\)(\\\\)

更多注意事项 

五、几种特殊用法

几个常见的预定的特殊字符

示例1:

1[0-9]{10} 和 1\d{10} 效果是一样的

示例2:

<meta charset="UTF-8">

正则描述为:<meta\s+charset=.*?>             (\s代表一个空白字符,+代表至少一个, )

示例3:

jiusen@163.com

正则表达式 [\w@.]+

用Java表示:String regex = "[\\w@.]+    (从[]中的字符中,选取1-n个)

测试代码

	public static void main(String[] args)
	{
		String content = "@jiusen.com";
		
		String regex = "[\\w@.]+";
		
		boolean isMatch = Pattern.matches(regex, content);
		
		System.out.println("匹配: " + isMatch);
	}

六、查找

代码

	public static void main(String[] args)
	{
		String content = "更多图片<img src='1.jpg'><br>"
				+ "示例2   <img src='2.jpg'><br>"
				+ "示例3   <img src='3.jpg'><br>";
		
		String regex = "<img .*>";
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(content);
		while(m.find())
		{
			System.out.println("**匹配: " + m.group(0));  //group(0)指全部
		}
	}

贪心模式 

	public static void main(String[] args)
	{
		String content = "更多图片<img src='1.jpg'><br>"
				+ "示例2   <img src='2.jpg'><br>"
				+ "示例3   <img src='3.jpg'><br>";
		
		String regex = "<img .*?>";
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(content);
		while(m.find())
		{
			System.out.println("**匹配: " + m.group(0));  //group(0)指全部
		}
	}

 

正则表达式的编译

七、获取分组 

	public static void main(String[] args)
	{
		String content = "更多图片<img src='1.jpg'><br>"
				+ "示例2   <img src='2.jpg'><br>"
				+ "示例3   <img src='3.jpg'><br>";
		
		String regex = "<img (.*?)>";
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(content);
		
		System.out.println("String regex = <img (.*?)>");
		while(m.find())
		{
			int start = m.start();
			String found = m.group(0);
			
			String src = m.group(1);
			
			System.out.println("group(0): " + found + "group(1): " + src);  //group(0)指全部
		}
	}

 

public static void main(String[] args)
	{
		String content = "更多图片<img src='1.jpg'><br>"
				+ "示例2   <img src='2.jpg'><br>"
				+ "示例3   <img src='3.jpg'><br>";
		
		String regex = "<img.*?src='(.*?)'\\s*>";
//		String regex = "<img (.*?)>";
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(content);
		
		System.out.println("<img.*?src=['\\\"](.*?)['\\\"]\\\\s*>" + "  " + "<img.*?src='(.*?)'\\s*>");
		while(m.find())
		{
			int start = m.start();
			String found = m.group(0);
			
			String src = m.group(1);
			
			System.out.println("group(0): " + found + "group(1): " + src);  //group(0)指全部
		}
	}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值