1.简单介绍正则表达式情况
正则表达式实际上是字符串处理利器:
Java.util.regex包下面有两个类:pattern,matcherl.
- matcher用来匹配字符串序列是否符合某个特定的pattern;
- pattern:定义的一个正则表达式;
额外小知识: java中:两个反斜杠标示一个反斜杠;Matcher匹配的过程中,会产生一个有限状态的自动机。
2.正则表达式的使用
1)正则表达式的 入门使用的两种写法:
1.Strings = "abx" ;
Boolean b= s.matches("...");
2.Patterp = Patter.compile("...");
String s="abc";
Matcher m= p.matcher(s);
Boolean b= m.mathes();
以上两种写法功能都是一样的,但是方法2能使用到mather的功能更强大,虽然1看上去要更简洁~推荐用2~~
POSIX是unix中的一套标准写法,用的不是很多
2)基本方法使用
1.lookingAt从头开始找。
2,find()
Matcherm的matches与 m.find()互相会有影响,matcher会吃点一些字符不会吐出来,然后调用find会匹配matcher之后的字符,而不是从头进行匹配,可使用m.reset使其回复到没匹配之前的字符串。mathcer匹配整个字符串,find找子串
Find 也不难用,会找到与pattern匹配的子串,使用方法:
Strings = "123-234443-8292-90-2934";
Patternp = Pattern.compile("\\d{3,5}");
Matcherm = p.matcher(s);
p("mathce:"+ m.matches());
m.reset();
p("find1:" + m.find());
p(m.start()+ "-" + m.end());
p("find2:" + m.find());
p(m.start()+ "-" + m.end());
p("find3:" + m.find());
p(m.start()+ "-" + m.end());
p("find4:" + m.find());
p(m.start()+ "-" + m.end());
p(m.lookingAt());
输出:mathce:false
find1:true
0-3
find2:true
4-9
find3:true
11-15
find4:true
19-23
3.group的使用:
String s ="123aaa-234443aaada-8292aa-90-2934aaaa";
Patternp = Pattern.compile("(\\d{3,5})([a-z]{2})");
Matcherm = p.matcher(s);
while(m.find()){
p(m.group(2));}
Mathcer.Group(i)正则表达式中会有很多小括号,想知道是那层group,可以数左小括号。
分组的好处在于,匹配一个正则表达式以后,可以选择性的挑出感兴趣的部分;比如邮箱知道了,但只想知道用户名,就可以输出用户名的那组~~
4.Flags的简写方式:?i表示打开insensitive的标志开关;
"java".matches("(?i)(java)");等同于:Pattern p =Pattern.compile("java",Pattern.CASE_INSENSITIVE)
5. 标示符。共分3类:
贪婪标示符:.[3-10]{0-9}匹配的时候会首先读取10个字符,然后进行整个字符串匹配,多了在回退一个字符~(正常的形式)
勉强标示符:以上的字符串,匹配的时候首先读取3个字符,然后进行正则表达式的匹配,少了再读一个~(正常形式+?)
独占标示符:与贪婪模式类似,区别在匹配不上时不会回退,若第一次匹配不上便结果为否,效率很高。(正常形式++)(很少用)
3)使用正则表达式的测试程序
1.小测试1:
跟着做了多个从文件中匹配邮箱地址的小程序,还不错,挺有成就感的,虽然代码跟人家的一样。 整体流程:读取文件,对每行进行匹配,将匹配到的结果输出到控制台~
Public void Read()throws FileNotFoundException{
BufferedReader br =new BufferedReader(new FileReader("E:/Workspaces/MyEclipse7.0/RegExp/test.txt"));
Stringline = "";
try{
while((line = br.readLine()) != null) {
parse(line);
}}catch (IOException e) {
e.printStackTrace();}}
Public void parse(String line){
Pattern p =Pattern.compile("[\\w[._]]+\\@[\\w[._]]+[\\w]+");
Matcherm = p.matcher(line);
while(m.find()) {
System.out.println(m.group());
}}}
在写codeCounter的时候,老师回哪一个文件做测试,放在别的路劲里的,所以,保护现场!学会做测试!
2)小测试2:
计算代码中的代码行,注释行,空白行。思想:获得文件夹,判断其中的文件匹配正则表达式:".*\\.java$"是的话读取文件,获得一行,matches("^\\s[^\\n]*$")为空白行,if(line.startwith("/*")){if(line.endwith("*/")){
Command==true}
else{command=false}commandLine++}
Elseif(command==true)commandLine++;
Elseif(line.startwith("//")commandLine++;)
其他的都是nomalLine;
整体思路很简单,就是考虑判断的时候要全面些,主要是对正则表达式的应用的熟悉,重要的学习一点是要学会测验自己的测试,这里用的是笨着,自己打开文件查,对照结果查看下~下面附上全部代码:
1.用正则表达式和字符串的方法进行处理读入行的代码:
private static voidcountCode(File f) throws FileNotFoundException {
BufferedReaderbr = new BufferedReader(new FileReader(f));
Stringline = "";
Booleancommand = false;
try{
while((line = br.readLine()) != null) {
line= line.trim();
if(line.matches("^[\\s]*$")) {
spaceLine++;
}else if (line.startsWith("/*")) {
if(!line.endsWith("*/"))
command= true;
else{
command= false;
}
commandLine++;
}else if (line.endsWith("*/") && (command == true)) {
commandLine++;
command= false;
}else if (line.startsWith("//")) {
commandLine++;
}
elseif (command == true) {
commandLine++;
}else {
nomalLine++;
}}
}catch (IOException e) {
e.printStackTrace();
}}
2.测试代码main:
public static voidmain(String[] args) throws FileNotFoundException {
Filefile = new File("E:\\Workspaces\\MyEclipse 7.0\\RegExp\\test");
File[]files = file.listFiles();
for(File f : files) {
Stringfilename = f.getName();
if(filename.matches(".*\\.java$")) {
countCode(f);
}}
p("space:" + spaceLine);
p("nomal:" + nomalLine);
p("command:" + commandLine);
}