正则表达式

####正则表达式:符合一定规则的字符串。负责字符串匹配处理规则。

一般有以下几种应用:
1.判断功能:
public boolean matches(String regex)

2.分割功能:
public String[] split(String regex)

3.替换功能:
public String replaceAll(String regex,String replacement)

4.获取功能:
Pattern 和 Matcher类的使用

简单罗列正则表达式的组成规则:
A:字符
x	字符 x。(任意一个字符代表字符本身)
\\	反斜线字符(在java中,\表示转义字符,故\\表示一个反斜杠)

B:字符类
[abc]		a、b 或 c	
[^abc]	任何字符,除了a、b或c
[a-zA-Z]	a到z  A到Z,即代表所有字母
[0-9] 	数字0到9

C:预定义字符类
.	任何字符(假如是  . 本身,就要用   \.  表示)
\d	数字:0到9 (可以代替 [0-9] )
\D	非数字:可代替  [^0-9]
\w	单词字符:可代替  [a-zA-Z_0-9]

D:边界匹配器
^	行的开头
$	行的结尾
\b	单词边界
就是不是单词字符的地方,如;hello world?yes:no(空格、?、:就是单词边界)

E:Greedy数量词(X代表字符)
X? 		X一次或一次也没有 
X* 		X零次或多次 
X+ 		X一次或多次 
X{n} 		X恰好 n 次 
X{n,} 	X至少 n 次 
X{n,m} 	X至少 n 次,但是不超过 m 次 

####正则表达式规则繁多且复杂,记不住也没必要记住,简单了解一下其组成规则,看得懂就行,在开发中如果要定义各种规则,可以直接到网上查找使用即可。




1.判断功能:public boolean matches(String regex)

简单代码附上:
便以讲解,假设手机号码(11位)的规则为仅以13、14、15、18开头,余下9位随机

import java.util.Scanner;
class Test {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.println("请输入手机号码:");
		String str = s.nextLine();
		System.out.println("checkPhoneNum:" +checkNum(str));
	}

	public static boolean checkNum(String str) {
//开头数字1表示1开头,[3458]表示3458中任一个数字,[0-9]数字0到9随机,{9}出现9次(11-前面2位)
		String regex = "1[3458][0-9]{9}";  
		boolean flag = str.matches(regex);//String类中的方法
		return flag;
	}
}




再难一点的例子;
匹配邮箱
定义邮箱规则:(假设邮箱整体是以下形式,形式仅作讲解参考不是标准形式)
122233764@qq.com
xxdd1997@163.com
xxdd1997@gmail.com
xxdd1997@sina.com.cn

String regex = "[a-zA-Z_0-9]+@[a-zA-z_0-9]+(\\.[a-zA-Z_0-9]+)+"
分析:
[a-zA-Z_0-9]+	  表示单词字符可出现任意次
@	表示 字符@
[a-zA-z_0-9]+	   同第一个
(\\.[a-zA-Z_0-9]+)+	  表示\.[a-zA-Z_0-9]+  整体可以出现任意次
注意: . 表示任意字符,如果要表示 . 本身就要 \. 然后又要注意,由于在java中,\表示转义字符,故\\表示一个反斜杠,所以要  \\.
2.分割功能:public String[] split(String regex)
说到正则表达式,又不得不说一下String类的split方法


附上一些面试题:(不要将注释符//和接下来的\\弄混了)
import java.util.Scanner;
class Test {
	public static void main(String[] args) {
		String s1 = "11.22.33";
		String s2 = "aa  bb     cc";
 //注意,文件路径要\\(\\表示反斜杠)
		String s3 = "C:\\Program Files\\Common Files\\System"; 
		
		//将这些字符串分割成11 22 33 和 aa bb cc 和C:  Program Files  Common Files  System并存放在字符数组中输出
		
		String[] strArray1 = s1.split("\\.");
		for (int x = 0; x < strArray1.length; x++) {
			System.out.println(strArray1[x]);
		}
		
		System.out.println("-----------------------");

		String[] strArray2 = s2.split(" +");  //表示分割规则为任意个空格数
		for (int x = 0; x < strArray2.length; x++) {
			System.out.println(strArray2[x]);
		}
		
		System.out.println("-----------------------");

		String[] strArray3 = s3.split("\\\\");  //要表示两个反斜杠,就要使用四个反斜杠
		for (int x = 0; x < strArray3.length; x++) {
			System.out.println(strArray3[x]);
		}
	}
}
3.替换功能


代码:
class Hello {
	public static void main(String[] args){
		String str = "我438喜5438欢3840你"; //去除字符串中间的数字
		String regex = "\\d";  //定义正则表达式
		String replacement = "*";  //将匹配正则表达式的子字符串换成*

		String result = str.replaceAll(regex,replacement);
		System.out.println(result);
	}
}

结果:我***喜****欢****你

4.获取功能
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Test {
	public static void main(String[] args) {
		//把正则表达式编译成模式对象
		Pattern p = Pattern.compile("1*2");

		//通过模式对象调用matcher()方法得到匹配器对象
		Matcher m = p.matcher("11112");
		
		//调用匹配器对象的matches()方法
		System.out.println(b);
	}
}

结果:true

容易发现,这个过程很像正则表达式的判断功能public boolean matches(String regex)
事实上,String类的matches()方法其实就是封装了以上步骤,所以直接调用简单。

那么,Patern类和Matcher类具体要如何用呢?(API解释)

public final class Pattern
extends Object
implements Serializable
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

*public final class Matcher
extends Object
implements MatchResult
通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

  ● matches 方法尝试将整个输入序列与该模式匹配。
 boolean matches() 
 
  ● lookingAt 尝试将输入序列从头开始与该模式匹配。
boolean lookingAt()

  ● find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
boolean find() 

在api中可以看到,典型的调用顺序是:
 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();





代码:
import jav*a.util.regex.Pattern;
import java.util.regex.Matcher;
class Test {
	public static void main(String[] args) {
		//定义字符串
		String str = "hello world it is nice to meet you see you later";
		//定义正则表达式
		String regex = "\\w{3}";//单词字符恰好出现3次

		//把规则编译成模式对象
		Pattern p = Pattern.compile(regex);
		//通过模式对象得到匹配器对象
		Matcher m = p.matcher(str);
		//调用匹配器对象的方法find()
		//通过find方法就是查找字符串中满足规则的子字符串

		while (m.find()) {
			System.out.println(m.group()); //group()功能: 返回由以前匹配操作所匹配的输入子序列。
		}
	}
}
结果:
hel
wor
nic
mee
you
see
you
lat

显然答案错了,我们是想找到只有三个单词字符的单词,是单词而不是三个连续的字符。
原来是因为正则表达式规则写错了,应该写成:\\b\\w{3}\\b(具体意思请回看正则表达式组成)
改了以后,答案:
you
see
you
然后还有一个需要注意:一定要先调用find()方法,才能再调用group()方法。

大概就是这些内容了。

另外附上一些常用正则表达式大全链接:http://www.jb51.net/article/77687.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值