正则表达式中级应用(java语言版)

1. 对特殊字符进行转义

元字符是在一些在正则表达式里有特殊含义的字符。英文句号”.”是一个元字符,它也可以匹配任何一个单个字符,类似的”[”,”]”也是元字符。

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string= "[\"a	b.c\"]";
		String regex = "(\\[\\\"a\tb\\.c\\\"\\])";
		Pattern pattern = Pattern.compile(regex);
		Matcher p = pattern.matcher(string);
		if(p.find()) {
			System.out.println(string);
		}
	}
}

结果:
["a	b.c"]

小知识:[\"a b.c\"]本质就是”a\tb.c”,我们在写他的正则时候一定要注意转义符的使用\\[\\\"a\tb\\.c\\\"\\。

[\b]

回退(并删除)一个字符(backsapce)

\f

换页符

\n

换行符

\r

回车符

\t

制表符(tab)

\v

垂直制表符

\d

任何一个数字字符[0-9]

\D

任何一个非数字字符[^0-9]

\w

任何一个[0-9a-zA-Z]字符

\W

任何一个[^0-9a-zA-Z]字符

\s

任何一个空白字符[\f\n\r\t\v]

\S

任何一个非空字符[^\f\n\r\t\v]

\x

十六进制(\x0a--->10)

\0

八进制(\011--->9)

小知识:如果我们要匹配array[10]该怎么匹配呢?我们可以使用array\\[\\d\\d\\]完成如果是100呢?我们将会下面进行解释。 

2.使用posix字符类

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string= "<BODY BGOLOR=\"336633\" TEXT=\"#ffffff\"";
		String regex = "([p{Digit}[2]])";
		Pattern pattern = Pattern.compile(regex);
		Matcher p = pattern.matcher(string);
		if(p.find()) {
			System.out.println(string);
		}
		
	}

}结果:
<BODY BGOLOR="336633" TEXT="#ffffff"

3.有多少个匹配

小问题:如果我们需要匹配text@text.text的邮箱,我们用以前的知识就会写出\\w@\\w\.\\w,但是问题就来了我们不知道各个部分的长度,这似乎不写的很合理。

3.1匹配一个或多个字符

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"ben@163.com","support@qq.com","abc@yahoo.com"};
		String regex = "(\\w+@\\w+\\.com)";
		
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
	}
}
结果:
ben@163.com
support@qq.com
abc@yahoo.com

提示:+是一个元字符,如果需要匹配+自身就需要转义符\\+

以上就有一个问题我们a.ben@163.com也是符合要求的,但是我们上面的正则却找不到他,于是我们就需要以下的式子

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"a.ben@163.com","ben@163.com","support@qq.com","abc@yahoo.com"};
		String regex = "([\\s|(\\w+\\.)]\\w+@\\w+\\.com)";
		//String regex = "([\\w.]@\\w+\\.com)";
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
	}

}
结果:
a.ben@163.com
ben@163.com
support@qq.com
abc@yahoo.com

+

一次或多个

*

零次或多个

表示此正则可以出现0次/1次

 

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
		String regex = "(http://[\\w./]+)";
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
	}

}
结果:
http://www.abc.com
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
		String regex = "(http://[\\w./]+)";
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
	}

}
结果:
http://www.abc.com
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
		String regex = "(https+://[\\w./]*)";
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
		
	}

}

结果:
https://www.abc.com
httpss://www.abc.com
httpsss://www.abc.com

知识点:在windows是使用\r\n作为文本行的结束标签。而linux、unix只是\n。所以我们可以尝试这样写正则:[\\r]?\n。

{n}

正则正好出现n次

{n,m}

正则正好出现n~m次

{n,}

正则至少出现n次

 

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string= "<BODY BGOLOR=\"336633\" TEXT=\"#ffffff\"";
		String regex = "([p{Digit}[2]])";
		Pattern pattern = Pattern.compile(regex);
		Matcher p = pattern.matcher(string);
		if(p.find()) {
			System.out.println(string);
		}
		
	}

}结果:
<BODY BGOLOR="336633" TEXT="#ffffff"
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[]= {"1001:$2134.43","1002:$2122.2523","1003:$55.2145","1001:$46664.321"};
		String regex = "(\\d+:\\$\\d{2,}\\d{2,})";
		Pattern pattern = Pattern.compile(regex);
		for (String xString:string)
		{
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
		
	}

}
结果:
1001:$2134.43
1002:$2122.2523
1001:$46664.321

贪婪型元字符

懒惰型元字符

*

*?

+

+?

{n,}

{n,}?

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string= "sdak<B>Ak</B>and<B>HI</B>sdas";
		String regex = "((<[bB]>.*</[Bb]>))";
		String result[] = string.split(regex);
		
		for (String string2 :result) {
			System.out.println(string2);
		}
	}

}
结果:
sdak
sdas

 

package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string= "sdak<B>Ak</B>and<B>HI</B>sdas";
		String regex = "((<[bB]>.*?</[Bb]>))";
		String result[] = string.split(regex);
		
		for (String string2 :result) {
			System.out.println(string2);
		}
	}

}
结果:
sdak
and
sdas

通过上面两个程序我们知道利用贪婪型元字符将”and”也给匹配进去了,而加了?的懒惰型元字符没有,我们写程序的时候需要按照实际需求编写代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值