2012-04-12 109 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的详细信息,请参阅此处。