java正则表达式matcher,find的区别以及匹配指定汉字

1、java正则表达式matcher,find的注意

正则很经常用,最近在开发碰到一些问题,提醒大家注意下。

一个字符串,要判断是否是数字,可以0为头

正确的做法:

Pattern intPattern = Pattern.compile("[0-9]+");
Matcher m = intPattern.matcher("aaa010222");
System.out.print(m.matches());

返回false,因为m.matches()是整串匹配,如果是 0102222,则返回true

错误做法:

Pattern intPattern = Pattern.compile("[0-9]+");
Matcher m = intPattern.matcher("aaaa10222");
System.out.print(m.find());

返回true,m.find() 会找某部分如果匹配就为完成,因此适合查找某部分符合特征

 


2、正则表达式之Java匹配指定汉字

        学习了正则表达式后,感觉正则表达式很强大,但是为了更好地理解正则表达式,找了一个很实际的问题来分享一下自己学习的心得。本题目是招聘时的一个题目,题目大致的意思是这样的:用户每次在网上消费东西,之后会给商家评论,但是这个评论中会有许多人评论一下小广告,为了能找出这些评论,我们假设这样一个场景:
     

经常的一些小广告会有下面一下词语:”网店地址“,“销售”,“代购”;

假如一个用户的评论是这样:这家酒店性价比高,提供海外代%……&购*&&6服……&**务”,网店地址:¥……**&*6“;

要求:匹配出关键字,并打印出关键字和该条评论。

就如上面这个题,我想已经表达的够清楚了,我们该怎么下手呢?我们经常的想法是一个一个扫描匹配,但是这样是不是太麻烦,而且有的评论中会有很多特殊字符,那我们怎么办呢?我的思路是这样,我们匹配的都是关键字,也就是汉字,那么可以将上述评论中所有的特殊符号(包括字母,空格,数字等)全部删除掉,只剩下汉字,然后我们去匹配关键字,这样就简单了,下来用一段程序说一下怎样去除特殊符号:
 

String string1 = "我爱编w!@#程  www#她不5454  dadad &*$()###(爱编dadada程w!";

String string1 = "我爱编w!@#程  www#她不5454  dadad &*$()###(爱编dadada程w!";
String regEx="[`~!@#$%^&*()+=|{}:;\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?a-zA-Z0-9 ]";
Pattern c = Pattern.compile(regEx);
Matcher mc=c.matcher(string1);
String result =  mc.replaceAll("").trim();  
System.out.println(result);

解释一下上面的程序:我给了这样一句话“我爱编w!@#程  www#她不5454  dadad &*$()###(爱编dadada程w!”,然后从这句话中找出匹配“编程”关键字;然后并输出,上面regEx是正则表达式,目的是过滤掉所有特殊字符,可能我写的这个有漏掉的字符,可以根据自己的需要修改,这样我们就将这句话经过过滤变成了下面这样:

上面已经去除掉特殊符号了,下来是最关键的是怎样匹配关键字呢?又用一个简单的程序示例说一下:

Pattern p = Pattern.compile("[编][程]");
Matcher m = p.matcher(result);
while(m.find()){
   System.out.println(m.group());
}

上面那个“("[编][程]")”就是匹配关键字,不能写成“[编程]”,如果写成“[编程]”就会出现每个字和上面那句话匹配,而不是一个词语匹配,和我们想要的结果截然不同,这个可以参考正则表达式的概念。如果有匹配的,输出匹配的关键字。下面是输出的结果,这句话中出现了两次编程,我们都匹配出来了,而且都输出来了。


这样我们就解决了这样一个很简单的例子,而且非常方便。下面我们回到上面最初的那个题目,其思路大致相同,我用Java实现了上面那个题目,下面附上代码,供参考:

/*
 * Author:huaxiaziyun
 * Create data :2015.9.11
 * Description:过滤评论中小广告
 */

public class test {
 public static void main(String args[]){

  String Comment_Txt=readFile("E:/text.txt");//读取用户评论
  String Phrase_Txt=readFile("E:/phrase.txt");//读取用户评论
  String Rst="";
  String[] s = Phrase_Txt.split(",");
     for(int i=0;i<s.length;i++){
  char[] Sm=s[i].toCharArray();
  for(int j=0;j<Sm.length;j++){
  String  m="["+Sm[j]+"]";
  Rst=Rst+m;
  }
    
 String regEx="[`~!@#$%^&*()+=|{}:;\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?a-zA-Z 0-9]";
 Matcher m_data=ConverCompile(Comment_Txt.toString().trim(), regEx);
    String result =  m_data.replaceAll("").trim(); 
    Matcher n_data=ConverCompile(result, ""+Rst+""); 
   
    while(n_data.find()){
   System.out.println(n_data.group());
   }
        Rst="";
   }
  }
 /*
  * 正则匹配
  */
 private static Matcher ConverCompile(String result,String regEx ){
  Pattern c = Pattern.compile(regEx);
     Matcher mc=c.matcher(result);
  return mc;
  
 }
 /*
  * 读取txt文件中的数据
  */
 private static String readFile(String road) {
  File file= new File(road);
   String encoding="GBK";
   String lineTXT = null;
   if(file.isFile()&&file.exists())
   {
    try {
    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
    BufferedReader bufferedReader=new BufferedReader(read);
    lineTXT=bufferedReader.readLine();
    read.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
   }
   return lineTXT;
 }

 

解释一下:用户的评论是从txt中读取出来的,关键字,也是从txt中读取出来的,下面给出图

然后经过匹配后,输出这句话中匹配的关键字,运行结果如下:

这样这个功能就完全实现了,把这个分享一下,希望对大家有用。新手学习,见谅。

 

 

参考地址:

https://blog.csdn.net/iteye_18969/article/details/82047094

https://blog.csdn.net/csdn_yaobo/article/details/48377757

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章