特殊字符的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访问日志。