正则表达式学习

      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);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值