2014-02-20 36 views
0

我不想在特殊字符(如「」,{},[])之間進行標記,我該怎麼辦?適用於特殊字符的Java StringTokenizer

String: "192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] 'GET /cgi-bin/try/ HTTP/1.0' 200 3395" 

,我想這樣的輸出:

192.168.2.20 
28/Jul/2006:10:27:10 -0300 
GET /cgi-bin/try/ HTTP/1.0 
200 3395 

我的代碼:

String rawData= "192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] 'GET /cgi-bin/try/ HTTP/1.0' 200 3395"; 
int i=0; 
String[] s1=new String[100]; 
String delim = " "; 
StringTokenizer tok = new StringTokenizer(rawData, delim, true); 

boolean expectDelim = false; 
while (tok.hasMoreTokens()) { 
    String token = tok.nextToken(); 
    if (delim.equals(token)) { 
     if (expectDelim) { 
      expectDelim = false; 
      continue; 
     } else { 
      token = null; 
     } 
    } 
    s1[i]=token; 
    System.out.println(s1[i]); 
    i+=1; 
    expectDelim = true; 
    } 
} 

輸出:

192.168.2.20 
- 
- 
[28/Jul/2006:10:27:10 
-0300] 
'GET 
/cgi-bin/try/ 
HTTP/1.0' 
200 
3395 

我可以爲這個日誌做到這一點。但是我想用我的代碼來處理所有的apache日誌。我怎樣才能做到這一點 ?

+0

是否將多個分隔符傳遞給StringTokenizer構造函數解決您的問題? '新的StringTokenizer(rawData,「 - []''」);' – anycard

+0

不,我不這麼認爲。對於這個問題,你可以使用字符串標記或簡單的字符串拆分方法,並創建解析一行並在循環中運行的函數。 – RMachnik

+3

從[Javadoc for'StringTokenizer'](http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html) - _StringTokenizer是爲保持兼容性原因而保留的遺留類,儘管它的使用在新代碼中是不鼓勵的。使用'String.split()'和正則表達式。 –

回答

0

您可以使用正則表達式是這樣的:

public class Main { 
    public static void main(String[] args) { 
     Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s.*\\s.*\\s\\[(.*)\\]\\s\\'(.*)\\'\\s(.*)"); 
     Matcher m = p.matcher("192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] 'GET /cgi-bin/try/ HTTP/1.0' 200 3395"); 
     boolean b = m.matches(); 

     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
     System.out.println(m.group(3)); 
     System.out.println(m.group(4)); 
    } 
} 
+0

©想要使用這個標記器爲所有日誌,這個正則表達式僅用於apache訪問日誌。 – user3334756

0

退房下面的代碼。在下面的代碼片段的「delim」字符串中進行標記時,加入你不想要的特殊字符。

String s = scan.nextLine(); 
String delim = "!,?._'@ "; 
StringTokenizer st = new StringTokenizer(s, delim); 
System.out.println(st.countTokens()); 
while(st.hasMoreTokens()){ 
    System.out.println(st.nextToken()); 
}