特殊字符的Java StringTokenizer

特殊字符的Java StringTokenizer,java,stringtokenizer,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

我不想在诸如“”{}、[]这样的特殊字符之间进行标记,我该怎么做

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日志使用我的代码。我如何才能做到这一点?

您可以像这样使用正则表达式:

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));
    }
}

检查以下代码。在以下代码段的“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());
}

将多个分隔符传递给StringTokenizer构造函数是否解决了您的问题<代码>新的StringTokenizer(rawData“-[]”)不,我不这么认为。对于这个问题,您可以使用字符串标记器,或者简单地对字符串使用split方法,并创建解析一行并在循环中运行的函数。从-StringTokenizer开始,它是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。使用
String.split()
和regex.İ希望对所有日志使用此标记器,此regex仅用于apache访问日志。