我可以用什么java正则表达式来匹配这个字符串?

时间:2013-11-08 18:27:48

标签: java regex string-matching data-manipulation

* EDIT2 正则表达式不一定是解决此问题的最佳方法。我所要做的只是验证数据[i]不包含'#'字符。 *

编辑我忘了提到这是用于验证。我用半冒号分割字符串但是这些是我需要解析的更大文件的一部分,显然我不希望我的解析器在尝试拆分不包含“;” <的字符串时中断/ p>


我想要一个正则表达式来匹配以下示例字符串。我已经用个别表达式(减去分号)完成了所有这些,但是我是一个正则表达式newb所以这个有问题。

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 分号 {{1} } 分号 PortNumber

以下是我过去用于各个组件的正则表达式。

日期和时间 - IPv4Address

URI - (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

端口号 - (@)?(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])$

IPv4地址 - ^\+?\d+$

我的解析器方法:

^([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])$

2 个答案:

答案 0 :(得分:1)

为什么要尝试匹配整条线。只需将行分为;

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

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

答案 1 :(得分:1)

  

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

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

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


}