2012-06-12 148 views
1

我從來都不是很好用正則表達式,我似乎無法得到這個...正則表達式語句

我想匹配沿着這些線路語句(這些都是在一個文本文件我的兩行米閱讀)

Lname Fname 12.35 1 
Jones Bananaman 7.1 3 

目前我使用的這一段聲明

reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]") 

但它不進入while語句。 當我刪除時,該程序讀取文本文件就好了。 代碼段是這樣的:

private void initializeFileData(){ 
    try { 
     Scanner reader = new Scanner(openedPath); 

     while(reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")){ 
      employeeInfo.add(new EmployeeFile(reader.next(), reader.next(), reader.nextDouble(), reader.nextInt(), new employeeRemove())); 
     } 
     for(EmployeeFile element: employeeInfo){ 
      output.add(element); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

回答

6

使用\s字符類單詞之間的空格:

while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")) 

更新:

根據的Javadoc的Scanner類,由默認情況下它使用空格分割它的標記。您可以使用useDelimiter(String pattern)方法Scanner更改它使用的分隔符。

private void initializeFileData(){ 
    try { 
     Scanner reader = new Scanner(openedPath).useDelimiter("\\n"); 
     ... 
     while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")){ 
     ... 

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

+0

我早些時候試過,它沒有工作,我也用你的代碼來檢查沒有運氣。我將它改回原來的位置,因爲我確信它應該可以與\\ s或''一起使用。無論如何,仍然沒有工作。 – user1228643

+0

嗯......它可能是那麼你需要使用不同的分隔符爲掃描儀,以便它拆分標記的換行而不是空白? 'Scanner reader = new Scanner(openedPath).useDelimiter(「\\ n」);' – FGreg

2

從我所看到的(並且糾正我,如果我錯了,因爲正則表達式似乎總是欺騙我的大腦:P),你沒有正確處理的空間。你需要使用\ s,不只是標準的''字符

編輯:對不起,\ s。別人打我給它:對

0

其實

\w+ 

打算捕[Lname, Fname, 12, 35, 1]Lname Fname 12.35 1。所以你可以存儲reader.nextLine(),然後從那裏提取所有的正則表達式匹配。從那裏,你可以抽象有點例如通過:

class EmployeeFile { 

..... 

    public EmployeeFile(String firstName, String lastName, 
         Double firstDouble, int firstInt, 
         EmployeeRemove er){ 
      ..... 
    } 

    public EmployeeFile(String line) { 
     //TODO : extract all the required info from the string array 
     //  instead of doing it while reading at the same time. 
     //  Keep input parsing separate from input reading. 
     //  Turn this into a string array using the regex pattern 
     //  mentioned above 

    } 



} 
0

我創建了自己的版本,沒有文件和最後一個循環,即是這樣說:

private static void initializeFileData() { 
     String[] testStrings = {"Lname Fname 12.35 1", "Jones Bananaman 7.1 3"}; 
     Pattern myPattern = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(\\d*\\.\\d{1,2})\\s+([0-5])"); 
     for (String s : testStrings) { 
      Matcher myMatcher = myPattern.matcher(s); 
      if (myMatcher.groupCount() == 4) { 
       String lastName = myMatcher.group(1); 
       String firstName = myMatcher.group(2); 
       double firstValue = Double.parseDouble(myMatcher.group(3)); 
       int secondValue = Integer.parseInt(myMatcher.group(4));     
       //employeeInfo.add(new EmployeeFile(lastName, firstName, firstValue, secondValue, new employeeRemove())); 
      } 
     } 
    } 

注意,我刪除了在點之前進行斜線(您想要一個點,而不是任何字符)並插入圓括號以創建組。

我希望它有幫助。