2014-02-20 71 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()); 
}