* EDIT2正则表达式不一定是解决这个问题的最佳方法。我所要做的就是验证 data[i] 不包含“#”字符。*
编辑我忘了提到这是为了验证。我确实用分号拆分字符串,但是这些是我需要解析的更大文件的一部分,显然我不希望我的解析器在尝试拆分不包含“;”的字符串时中断
我想要一个正则表达式来匹配以下示例字符串。我已经用单独的表达式(减去分号)完成了所有这些,但是我是一个正则表达式新手,所以在这个表达式上遇到了麻烦。
2013/11/06 15:34:01;website.some.net;80;43.121.103.95
2013/11/06 15:45:15;site.test.com;8080;43.22.118.51
分解它是
date
空格 HH:MM:SS
分号 URI
分号 PortNumber
分号分号 IPv4Address
这是我过去用于单个组件的正则表达式。
日期和时间 -(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})
URI -(@)?(href=')?(HREF=')?(HREF=\")?(href=\")?(http://)?[a-zA-Z_0-9\\-]+(\\.\\w[a-zA-Z_0-9\\-]+)+(/[#&\\n\\-=?\\+\\%/\\.\\w]+)?") && !data[i].matches("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$
端口号 -^\+?\d+$
IPv4 地址 -^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$
我的解析器方法:
public void setList(String Page){
String[] data = Page.toLowerCase().replace("#comment#", "").split(";"); //remove comments
String[] dateTime = null; //date time array
String formattedIP = null; //stores the parsed IP address
for(int i = 0; i < data.length; i++){
if(data[i].contains("/")){ //date and time field
dateTime = data[i].split(" ");
dates.add(dateTime[0].substring(dateTime[0].indexOf('/') - 4 ));
times.add(dateTime[1]);
}
formattedIP = data[i].replace(dateTime[0].substring(dateTime[0].indexOf('/') - 4 ),"").replace(dateTime[1], "").trim();
if(formattedIP.matches("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$")){
IPs.add(formattedIP);
}
if(data[i].matches("-?\\d+(\\.\\d+)?")){
ports.add(data[i]);
}
if(data[i].matches("(@)?(href=')?(HREF=')?(HREF=\")?(href=\")?(http://)?[a-zA-Z_0-9\\-]+(\\.\\w[a-zA-Z_0-9\\-]+)+(/[#&\\n\\-=?\\+\\%/\\.\\w]+)?") && !data[i].matches("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$")){
URIs.add(data[i]);
}
}
}