2013-03-04 49 views
1

我想從下面的一個名爲'query'的文件中找到表名&列名。如何在包含單個點或句點的文件中獲取單詞?

var query = " SELECT accounts.name, SUM((COALESCE((jan_val_c),0)+ "; 
query += " COALESCE((feb_val_c),0)+ COALESCE((march_val_c),0)+ COALESCE((apr_val_c),0)+ "; 
query += " COALESCE((may_val_c),0)+ COALESCE((june_val_c),0)+ COALESCE((july_val_c),0)+ "; 
query += " COALESCE((aug_val_c),0)+ COALESCE((sept_val_c),0)+ COALESCE((oct_val_c),0)+ "; 
query += " COALESCE((nov_val_c),0)+ COALESCE((dec_val_c),0))) AS sales_plan,SUM((COALESCE((jan_actual_val_c),0)+ "; 
query += " COALESCE((feb_actual_val_c),0)+ COALESCE((march_actual_val_c),0)+ COALESCE((apr_actual_val_c),0)+ "; 
query += " COALESCE((may_actual_val_c),0)+ COALESCE((june_actual_val_c),0)+ COALESCE((july_actual_val_c),0)+ "; 
query += " COALESCE((aug_actual_val_c),0)+ COALESCE((sept_actual_val_c),0)+ COALESCE((oct_actual_val_c),0)+ "; 
query += " COALESCE((nov_actual_val_c),0)+ COALESCE((dec_actual_val_c),0))) AS Actual_plan ,month_name_c, "; 
query += " cl_sales_planning_month.year_c, cl_products.volume,cl_brands.name AS brand ,cl_therapies.name "; 
query += " AS therapy,cl_products.name AS product, accounts.created_by,accounts.assigned_user_id , "; 
query += " DATE_FORMAT(STR_TO_DATE(CONCAT_WS('-',cl_sales_planning_month.month_name_c, "; 
query += " cl_sales_planning_month.year_c),'%M-%Y'),'%b-%y') AS monthyear FROM cl_sales_planning_month "; 
query += " LEFT JOIN accounts ON cl_sales_planning_month.account_id_c =accounts.id LEFT JOIN cl_products "; 
query += " ON cl_sales_planning_month.cl_products_id_c = cl_products.id LEFT JOIN cl_brands ON "; 
query += " cl_products.cl_brands_id_c=cl_brands.id LEFT JOIN cl_therapies ON "; 
query += " cl_products.cl_therapies_id_c=cl_therapies.id WHERE "; 
query += "   cl_sales_planning_month.month_name_c = MONTHNAME(CURRENT_DATE - INTERVAL 2 MONTH) AND "; 
     query += "   cl_sales_planning_month.year_c = YEAR(CURRENT_DATE - INTERVAL 2 MONTH) AND"; 

query += " cl_sales_planning_month.user_id_c IN ("+ params["childs"].value +") "; 
query += " GROUP BY therapy,monthyear "; 
query += " ORDER BY STR_TO_DATE(cl_sales_planning_month.year_c,'%Y') ASC, "; 
query += " STR_TO_DATE(cl_sales_planning_month.month_name_c,'%M') ASC, Actual_plan DESC "; 

爲此,我寫了一個Java程序:

package com.waprau; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 
import java.util.regex.Pattern; 

public class SeparateTableNamesColumnNames { 
    public static void main(String[] args) { 
     File file = new File("/home/waprau/Desktop/query"); 
     //Pattern = new Pattern("([^\\s]+(\\.(?i))$)"); 

     try { 
      Scanner scanner = new Scanner(file); 
      scanner.useDelimiter("\\s|=|,|\\)|\\(|this.|\\]."); 

      while(scanner.hasNext()){ 
       if(scanner.next().matches("(?<!\\.)\\b[a-zA-Z]\\w*\\.[a-zA-Z]\\w*\\b(?!\\.)")) 
       System.out.println(scanner.next());; 
       } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

隨着上述程序,我能夠分離所有單詞。但我只想得到包含單個點或句點的單詞,例如accounts.name,cl_sales_planning_month.year_c,cl_products.volume,cl_brands.name,cl_therapies.name等。然而,我無法找到一個模式或任何可以從文件中分離這些單詞。

但它不工作。

這是我得到的結果:

enter image description here

這就是我想要的東西:

enter image description here

任何幫助表示讚賞。

回答

1

要匹配包含點的單詞,您可以使用:"\\w+\\.\\w+"

\w匹配字母,數字和下劃線。

但是,這也會匹配一段時間以上的東西。您可以通過使用查找變通,以確保沒有其他時間段之前或之後單詞你都匹配改進:

"(?<!\\.)\\b\\w+\\.\\w+\\b(?!\\.)" 

這包含一個點一個字相匹配,而不能前或後立即包含點。 \b是一個字的邊界。

但是,這將匹配十進制數字,如123.45。表格可以包含數字,但不能從一個開始。所以,我們也可以確保每個單詞以字母開頭:

"(?<!\\.)\\b[a-zA-Z]\\w*\\.[a-zA-Z]\\w*\\b(?!\\.)" 
+0

感謝快速回復dan1111。但是,它不起作用。 – waprau 2013-03-04 14:47:26

+0

@waprau,你也可能需要爲每個反斜槓添加雙重轉義。見Joop Eggen的答案。對不起,我知道正則表達式,但不是Java。 – 2013-03-04 15:02:05

+0

請找到我的問題編輯雙逃脫。但仍然沒有成功。 :-( – waprau 2013-03-04 15:22:04

1

週期.來轉義,因爲它意味着「任何字符」。由於這是不正常的字符串轉義(如\n)它使用兩個反斜槓:\\.

\\s

1

無論正則表達式(dan1111的答案似乎涵蓋了這一點)。您的Java代碼中存在缺陷,scanner.next()會獲取下一個字符串,並且由於您將其調用了兩次,因此不會打印出您匹配的內容。相反,您會在每場比賽之後打印該項目。

如果你改變你的循環如下它似乎打印你想要什麼:

String tmp; 
while (scanner.hasNext()) { 
    // Store next item so we can match AND print it. 
    tmp = scanner.next(); 
    if (tmp.matches("(?<!\\.)\\b[a-zA-Z]\\w*\\.[a-zA-Z]\\w*\\b(?!\\.)")) 
     System.out.println(tmp); 
} 
+0

Spot on!感謝rvalvik。似乎它正在工作。讓我試試更多的文件,如果有任何問題,我會發布。 – waprau 2013-03-04 16:13:47

相關問題