####正则表达式:符合一定规则的字符串。负责字符串匹配处理规则。
一般有以下几种应用:
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