1. 程式人生 > >正則表示式之Java匹配指定漢字

正則表示式之Java匹配指定漢字

           學習了正則表示式後,感覺正則表示式很強大,但是為了更好地理解正則表示式,找了一個很實際的問題來分享一下自己學習的心得。本題目是招聘時的一個題目,題目大致的意思是這樣的:使用者每次在網上消費東西,之後會給商家評論,但是這個評論中會有許多人評論一下小廣告,為了能找出這些評論,我們假設這樣一個場景:

           經常的一些小廣告會有下面一下詞語:”網店地址“,“銷售”,“代購”;

           假如一個使用者的評論是這樣:這家酒店價效比高,提供海外代%……&購*&&6服……&**務”,網店地址:¥……**&*6“;

        要求:匹配出關鍵字,並打印出關鍵字和該條評論。

        就如上面這個題,我想已經表達的夠清楚了,我們該怎麼下手呢?我們經常的想法是一個一個掃描匹配,但是這樣是不是太麻煩,而且有的評論中會有很多特殊字元,那我們怎麼辦呢?我的思路是這樣,我們匹配的都是關鍵字,也就是漢字,那麼可以將上述評論中所有的特殊符號(包括字母,空格,數字等)全部刪除掉,只剩下漢字,然後我們去匹配關鍵字,這樣就簡單了,下來用一段程式說一下怎樣去除特殊符號:

        String string1 = "我愛編[email protected]#程  www#$$$$她不5454  dadad &*$()###(愛編dadada程w!";

        String regEx="[`

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

解釋一下上面的程式:我給了這樣一句話“我愛編

[email protected]#程  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="[`[email protected]#$%^&*()+=|{}:;\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?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中讀取出來的,下面給出圖“

然後經過匹配後,輸出這句話中匹配的關鍵字,執行結果如下:

這樣這個功能就完全實現了,把這個分享一下,希望對大家有用。新手學習,見諒。

相關推薦

表示式Java匹配指定漢字

           學習了正則表示式後,感覺正則表示式很強大,但是為了更好地理解正則表示式,找了一個很實際的問題來分享一下自己學習的心得。本題目是招聘時的一個題目,題目大致的意思是這樣的:使用者每次

表示式貪婪匹配與非貪婪匹配

. :匹配除 "\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用像 '[.\n]' 的模式 * :匹配0個或多個 使用 .* 的話就可以匹配任意長度的任意字元,但是有時候在使用 .*時就可能匹配不到物品們想要的結果,例: import re

js表示式人民幣匹配

   人民幣格式匹配   小寫格式:¥ 符號 和 整數值 與小數3部分組成。   (0)程式碼與執行結果   { // 匹配人民幣 let [reg, info, rmb, result] = [ /^(¥)

lua的表示式模式匹配(轉)

原文地址:http://blog.csdn.net/zhangxaochen/article/details/8084396 函式原型 string.find(s, pattern [, init [, plain]] )  s: 源字串  pattern: 待搜尋模式

Python學習筆記模式匹配表示式使用和不使用表示式

 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線-------------------------------------------   假設你希望在字串中查詢電話號碼。你知道模式:3個數字,一

Nginx表示式匹配操作符詳解

Nginx正則表示式之匹配操作符詳解 nginx可以在配置檔案中對某些內建變數進行判斷,從而實現某些功能。例如:防止rewrite、盜鏈、對靜態資源設定快取以及瀏覽器限制等等。由於nginx配置中有if指令,但是沒有對應else指令,所以判斷要分為匹配和不匹配。

Java使用表示式(-|\\+)?(\\d+)*.?\\d+匹配正數、負數、浮點數

1簡介 可以使用正則表示式對字串進行匹配,比如對使用者輸入的字串進行有效性驗證。 2Java正則表示式 正則表示式定義了字串的模式。 正則表示式可以用來搜尋、編輯或處理文字。 正則表示式並不僅限於某一種

java 表示式java表示式匹配圖片個數

Java 正則表示式和 Perl 的是最為相似的。 java.util.regex 包主要包括以下三個類: 1、Pattern 類: pattern 物件是一個正則表示式的編譯表示。Pattern 類沒

Java經典例項:表示式,找到匹配的文字

import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank */ public class REMatch { public static void main(

java表示式 match find匹配位置

                如題,對於java正則表示式這幾個方法匹配一次後的,匹配位置搞不太清楚,就寫了幾個例子。如下:

表示式最短匹配

貪婪與懶惰當正則表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配儘可能多的字元。考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。有時,我們更需

Java表示式分組和替換

正則表示式的子表示式(分組)不是很好懂,但卻是很強大的文字處理工具。 1 正則表示式熱身 匹配電話號碼 // 電話號碼匹配 // 手機號段只有 13xxx 15xxx 18xxxx 17xxx System.out.println("18304

表示式 日常使用 匹配空行 刪除指定文字所在行 ...

正則表示式匹配空行測試所用的編輯器:notepad++^(\s*)\r\n根據文件格式(windows, mac, linux行尾符)不同 將其中的\r\n替換成不同行尾符windows: ^(\s*)\r\nlinux: ^(\s*)\nmac: ^(\s*)\r (沒用過

表示式前後查詢(Java版) 例項

參考部落格:http://blog.csdn.net/libingxin/article/details/7840998 ?= 正向向前查詢:出現在指定項之後的字元序列不會被正則表示式引擎返回 ?<= 正向向後查詢:出現在指定項之前的字元

python3進階表示式re模組分組(group)、貪心匹配、編譯

  除了簡單地判斷是否匹配之外,正則表示式還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345'

python核心程式設計-表示式-匹配多個字串

#!/usr/bin/env python # -*- coding: UTF-8 -*- import re bt = 'bat|bet|bit' m = re.match(bt,'bat') i

Java表示式擷取字串

正則表示式很強大,熟悉正則表示式可以少些很多程式碼。常見的有,驗證使用者名稱/密碼是否合法,擷取字串等。這篇文章主要圍繞擷取字串做個簡單的介紹; 假設有個需求:在一長段亂七八糟的字串中擷取需要的資訊。 這裡有一個亂七八糟的字串:fjsdh(1234567

java表示式捕獲分組與Back引用

一.捕獲分組 java正則表示式中以()括起來的內容表示一個分組,像((A)(B(C)))這個表示式中,共存在四個分組: 1.ABC 2.A 3.BC 4.C 很容易發現,分組是按照左邊的括號出現的順序來標號的 這就是捕獲分組 二.Back引用 我們以下面這個正則表示式為例

javascript表示式最長匹配(貪婪匹配)和最短匹配(懶惰匹配

最近在閱讀RequireJS 2.1.15原始碼,原始碼開始處定義了一系列的變數,有4個正則表示式: var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)

Java經典例項:表示式,替換匹配的文字

import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank * 替換匹配的文字 */ public class ReplaceDemo { public static vo