URL中的正则表达式关键字匹配

时间:2012-06-28 08:22:25

标签: java regex

我在一个大文件(20 mb)中有一个URL列表,我有一组关键字。如果关键字集与网址匹配,那么我想提取网址。

例:关键字= “接触” 网址:http://www.365media.com/offices-and-contact.html

我需要一个正则表达式来匹配关键字和我的网址列表。

我的Java代码:

public class FileRead {

    public static void main(String[] ags) throws FileNotFoundException
    {
        Scanner in=new Scanner(new File("D:\\Log\\Links.txt"));
        String input;
        String[] reg=new String[]{".*About.*",".*Available.*",".*Author.*",".*Blog.*",".*Business.*",
    ".*Career.*",".*category.*",".*City.*",".*Company.*",".*Contain.*",".*Contact.*",".*Download.*",
    ".*Email.*"};
        while(in.hasNext())
        {
            input=in.nextLine();
            //for(String s:reg)
                patternFind(input,".*email.*");
        }

    }
    public static void patternFind(String input,String reg)
    {
        Pattern p=Pattern.compile(reg);
            Matcher m=p.matcher(input);
            while(m.find())
                System.out.println(m.group());
    }
}

3 个答案:

答案 0 :(得分:1)

如果您只想匹配当前行中任何关键字的存在,您只需使用

即可
for (String s: reg) {
  if (input.contains(s)) {
    // do something
  }
}
而不是     patternFind(输入 “电子邮件。”);

无论如何,相当于匹配任何单词的正则表达式将是:

.*(About|Available|Author|And|So|On...).*

我不确定哪一个更快。 String.contains()更简单,一个Pattern被预编译,可以在多次应用时表现更好,就像这里的情况一样。

答案 1 :(得分:1)

为什么你不能这样做:

For all line (URLs) in the file check if some of your pattern works on the URL

代码非常明显

答案 2 :(得分:0)

我将给出一些通用的解决方案。我认为你应该能够将这个想法适应你的代码。

假设您在文件中列出了裸露的关键字,并将其读入String[],或者您对String[]中的关键字列表进行了硬编码,例如:

String keywords[] = {"about", "available", "email"};

对于所有关键字,请使用Pattern.quote()确保它们被识别为文字字符串。然后将关键字与条形字符|连接为分隔符(OR),并用括号()包围所有内容。最终结果将是这样的。或者,您可以自己查看关键字并编写正则表达式而不使用引号\Q\E。如果您确定关键字不包含正则表达式,也可以忽略Pattern.quote()步骤。

(\Qabout\E|\Qavailable\E|\Qemail\E)

.*添加到2个结尾以使其与网址的其余部分匹配,并在开头添加(?i)以启用不区分大小写的匹配。

(?i).*(\Qabout\E|\Qavailable\E|\Qemail\E).*

然后你可以编译Pattern并在每行输入上调用matcher(inputString).matches()来检查URL是否有关键字。

如果关键字在网址中过于常见,例如“com”,“net”,“www”,并且您希望使搜索更精细,则必须进行更多调整。