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

 

 

 

 

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