-1

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


    }
4

2 回答 2

1

你为什么要匹配整行。只需将行拆分;

String[] arr = line.split(";");

arr[0], arr[1], arr[2]然后使用等访问/检查/解析单个数组组件。

于 2013-11-08T18:30:21.817 回答
1

每 @Cruncher @JaminBecker 如果其中一个无效,那么它们都是无效的。那有什么问题?布尔有效 = validateDate(arr[0]) && validateTime(arr[1]) && ...

因此,我只是确保我从字符串中拆分出来的数组的当前索引不包含注释,比下面的复杂正则表达式更好的解决方案是我修改后的解析器方法

public void setList(String Page){
    String[] data = Page.toLowerCase().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("#")){**
            if(data[i].contains("/")){ //date and time field
                System.out.println(data[i]);
                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]);
            }
        }
    }


}
于 2013-11-08T19:03:54.140 回答