正則表示式之Java匹配指定漢字
學習了正則表示式後,感覺正則表示式很強大,但是為了更好地理解正則表示式,找了一個很實際的問題來分享一下自己學習的心得。本題目是招聘時的一個題目,題目大致的意思是這樣的:使用者每次在網上消費東西,之後會給商家評論,但是這個評論中會有許多人評論一下小廣告,為了能找出這些評論,我們假設這樣一個場景:
經常的一些小廣告會有下面一下詞語:”網店地址“,“銷售”,“代購”;
假如一個使用者的評論是這樣:這家酒店價效比高,提供海外代%……&購*&&6服……&**務”,網店地址:¥……**&*6“;
要求:匹配出關鍵字,並打印出關鍵字和該條評論。
就如上面這個題,我想已經表達的夠清楚了,我們該怎麼下手呢?我們經常的想法是一個一個掃描匹配,但是這樣是不是太麻煩,而且有的評論中會有很多特殊字元,那我們怎麼辦呢?我的思路是這樣,我們匹配的都是關鍵字,也就是漢字,那麼可以將上述評論中所有的特殊符號(包括字母,空格,數字等)全部刪除掉,只剩下漢字,然後我們去匹配關鍵字,這樣就簡單了,下來用一段程式說一下怎樣去除特殊符號:
String string1 = "我愛編[email protected]#程 www#$$$$她不5454 dadad &*$()###(愛編dadada程w!";
String regEx="[`
Pattern c = Pattern.compile(regEx);
Matcher mc=c.matcher(string1);
String result = mc.replaceAll("").trim();
System.out.println(result);
解釋一下上面的程式:我給了這樣一句話“我愛編
上面已經去除掉特殊符號了,下來是最關鍵的是怎樣匹配關鍵字呢?又用一個簡單的程式示例說一下:
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;
}
然後經過匹配後,輸出這句話中匹配的關鍵字,執行結果如下:
這樣這個功能就完全實現了,把這個分享一下,希望對大家有用。新手學習,見諒。
相關推薦
正則表示式之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