2012-04-12 102 views
0

提取信息對於一個任務,我需要從文件中提取(在Java中)某些信息,這些文件中的文本去與此類似:正則表達式從特定文件

OFFICE_MANAGEMENT =  Higher ManagementCONSTRUCTION = SupervisorCONTRACT_MANAGEMENT = Contract ManagerPROJECT = Project ManagerLOCATION = User Specified LocationDEPARTMENT = Local.........  

我需要提取每個具體項目

我很少或沒有在正則表達式的經驗,但我試過。

如果我使用類似

OFFICE_MANAGEMENT =\s*([a-z A-Z]*)\s* 

我得到

Higher ManagementCONSTRUCTION 

的結果。我可能不會改變文字:(

我怎麼能確保他採取每一個,直到下一個項目。我想他需要閱讀一切,直到下一個單詞與更多的一個Captital字母,但我不知道如何要做到這一點。

因此,任何幫助或建議會更歡迎屆時

+0

沒有換行符? – Matten 2012-04-12 13:05:56

+0

在試圖給你寫一個答案之前......什麼分隔鍵 - 值對(或「項目」與你的術語)?新鑰匙「開始」在哪裏?什麼定義了「項目」? – 2012-04-12 13:16:10

回答

3

假設鍵是全部大寫(加上可能下劃線):

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile(
    "([\\p{Lu}_]+) # one or more characters, all caps and underscores\n" + 
    "\\s*=\\s*  # equals sign, possibly surrounded by whitespace\n" + 
    "([^=]+)  # any letters except equals sign\n" + 
    "(?<=\\p{Ll}) # but only until the last lowercase letter", 
    Pattern.COMMENTS); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

您的字符串轉換成

分離
OFFICE_MANAGEMENT =  Higher Management 
CONSTRUCTION = Supervisor 
CONTRACT_MANAGEMENT = Contract Manager 
PROJECT = Project Manager 
LOCATION = User Specified Location 
DEPARTMENT = Local 

(和每場比賽,regexMatcher.group(1)包含標題和regexMatcher.group(2)包含描述。)

+0

awsome。感謝您的正則表達式並記錄每個部分 – 2012-04-12 13:38:27

+0

有沒有辦法在java(正則表達式)中使這個通用?我的意思是在第一部分(在=之前)泛型,所以我能夠提取特定的東西(當我打電話給我時),所以我可以重複使用代碼嗎? – 2012-04-12 13:46:49

+0

@DarthBlueRay:我這麼認爲 - 你的意思是通用的?你有一些例子嗎? – 2012-04-12 15:42:53

2

試着這麼做

[A-Z_]+\s*=\s*(?:\s?[A-Z][a-z]+)+ 

看到它here on Regexr

這將匹配=之前的大寫字母和下劃線組成的單詞以及等號後面的一個或多個單詞,該單詞以大寫字母開頭,然後是小寫字母。

而這裏的Java Unicode版本:

String text = "OFFICE_MANAGEMENT =  Higher ManagementCONSTRUCTION = SupervisorCONTRACT_MANAGEMENT = Contract ManagerPROJECT = Project ManagerLOCATION = User Specified LocationDEPARTMENT = Local"; 

Pattern p = Pattern 
      .compile("[\\p{Lu}\\p{Pc}]+\\s*=\\s*(?:\\s?\\p{Lu}\\p{Ll}+)+"); 
Matcher m = p.matcher(text); 
while(m.find()){ 
    System.out.println(m.group(0)); 
} 

\\p{Lu}一個Unicode代碼點與物業大寫字母

\\p{Ll}一個Unicode代碼點與物業小寫字母

\\p{Pc}一個標點符號如連接單詞的下劃線

關於Unicode code properties的詳細信息,請參閱此處。