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

正则表达式是现代编程的一个极为重要的技能之一,在开发的过程中我们经常需要进行字符串的筛选,截取等操作。接下来我会将《正则表达式必知必会》里的知识点使用java语言描述。

1. Java正则基本知识点

正则标记

1.单个字符(数量1)

         字符:表示由一个字符组成

         \\:表示转义符号'\'

         \t:表示一个'\t'符号

         \n:匹配换行(\n)符号

2.一组字符(数量1)

         [abc]:表示可能是字符a/b/c任意一位

         [^abc]:表示不是"abc"中的任意一位

         [a-z]:表示所有的小写字母

         [a-zA-Z]:表示任意的一位字母,不区分大小写

         [0-9]:表示任意一位数字

3.简化字符集表示(数量1)

         ".":表示任意的一位字符

         \d:等价于"[0-9]"属于简化写法(\\d)

         \D:等价于"[^0-9]"

         \s:表示任意的空白字符,例如:"\t","\n"

         \S:表示非空字符

         \w:等价于"[a-zA-Z_0-9]"表示由任意的字母,数字下划线组成

         \W:非\w

4.边界匹配(一般在js使用)

         ^:正则的开始

         $:正则的结束

5.数量表达

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

         +:表示此正则可以出现1次/1次以上

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

         {n}:表示此正则正好出现n次

         {n,}:表示此正则正好出现n次以上

         {n,m}:表示此正则正好出现n~m次

6.逻辑运算:

         正则1正则2:正则1判断完成之后继续判断正则2

         正则1 | 正则2:正则1/正则2满足一个就可

         (正则):将多个正则作为一组,可以为这一组担负设置出现的次数

2. 匹配纯文本

package 正则;
//匹配单个字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Exp001 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string = "hello.my name is Ben.please....";
		String regex = "Ben";
		Pattern pattern = Pattern.compile(regex);
		Matcher p = pattern.matcher(string);
		System.out.println(p.find());
	}

}
结果:true
package 正则;
//匹配多个字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string = "hello.my name is Ben.please....";
		String regex = "((Ben)|(my))";
		
		Pattern pattern = Pattern.compile(regex);
		Matcher p = pattern.matcher(string);
		System.out.println(p.find());
	}

}
结果:true

知识扩展:正则表达式是区分大小写的,所以Ben不匹配ben。

3.匹配任意字符串

知识扩展:如果你在Dos的文件搜索功能,你将发现正则表达式里面的(java语言)”.”字符相当于dos里面的”?”字符,SQL用户将发现正则表达式里的”.”相当于”_”字符。

package 正则;
//匹配ab*c字符
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[] = {"sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "(sale.)";
		Pattern pattern = Pattern.compile(regex);
		for(String xString :string) {
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
	}

}

结果:
sales1.xls
sale3.xls
sale2.xls

知识扩展:”.”字符可以匹配任何单个的字符、字母、数字甚至是”.”字符本身,所以如下代码成立。

package 正则;
//匹配ab*c字符
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Exp001 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
//多加了一个sale.xls请注意
		String regex = "(sale.)";
		Pattern pattern = Pattern.compile(regex);
		for(String xString :string) {
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
	}

}

结果:
sale.xls
sales1.xls
sale3.xls
sale2.xls

知识扩展:在同一个正则表达式内我们允许使用多个”.”字符,他们既可以连续出现(一个接着一个——..将匹配任意两个字符),也可以间隔出现在模式的不同位置。

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[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "(.a.)";
		Pattern pattern = Pattern.compile(regex);
		for(String xString :string) {
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
	}

}

结果:
sale.xls
sales1.xls
sale3.xls
sale2.xls
apac1.xls
na1.xls
sa1.xls

小问题:我们需要匹配.a.模式的文件话那该怎么写呢?我们知道就算就写.a..也只是匹配.a后面两个任意字符而不是单独匹配我们的.这个单个字符。

所以在这里我们需要使用转义符”\”进行转义。

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[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "(.a.\\.xls)";
		Pattern pattern = Pattern.compile(regex);
		for(String xString :string) {
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
	}

}

结果:
na1.xls
sa1.xls

4.匹配一组字符

再接着上面的例子如果我们还是仍然想找出na/sa,我们应该怎么办?如果我们使用.a\\.也会出现ca.xls。

所以我们将会使用员字符[和]来定义一个字符集合。

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[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "((n|s)a.\\.xls)";
		Pattern pattern = Pattern.compile(regex);
		for(String xString :string) {
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
		}
		
	}

}

结果:
na1.xls
sa1.xls

字符集合中不需要区分字母大小写(或者是只须匹配某个特定部分)的搜索操作里比较常见。比如匹配以下字符数组:

"RegEx","regex","regEx","Regex","segex"

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[]= {"RegEx","regex","regEx","Regex","segex"};
		String regex = "([Rr]eg[Ee]x)";
		for (String xString :string) {
			Pattern pattern = Pattern.compile(regex);
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
			
		}
		
	}

}

结果:
RegEx
regex
regEx
Regex

5.利用字符集合区间

小问题:如果我们需要筛选出[ns]a.\.xls文件筛选出nsm.xls怎么排除它?

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[]= {"asm.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "([ns]a\\d\\.xls)";
		for (String xString :string) {
			Pattern pattern = Pattern.compile(regex);
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
			
		}
		
	}

}

结果:
na1.xls
sa1.xls

小知识:[a-zA-Z0-9]这个字符集所简写的形式是:{a-z,A-Z,0-9}

而java内的\S则是非空字符,需要注意的是前者是后者的子集。

6.取非匹配

由于某些场合我们需要匹配一个字符的取反情况。我们可以使用元字符^来表达相对一个字符集进行非空匹配。

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[]= {"nas.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
		String regex = "([ns]a[^0-9]\\.xls)";
		for (String xString :string) {
			Pattern pattern = Pattern.compile(regex);
			Matcher p = pattern.matcher(xString);
			if(p.find()) {
				System.out.println(xString);
			}
			
		}
		
	}

}

结果:nas.xls

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值