0

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

示例:keyword="contact" URL:http ://www.365media.com/offices-and-contact.html

我需要一个正则表达式来匹配关键字与我的 URL 列表。

我的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());
    }
}
4

3 回答 3

1

如果您只想匹配当前行中是否存在任何关键字,您可以简单地使用

for (String s: reg) {
  if (input.contains(s)) {
    // do something
  }
}

而不是 patternFind(input,". email. ");

无论如何,一个等价于匹配任何单词的正则表达式将是:

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

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

于 2012-06-28T08:30:42.033 回答
1

为什么你不能这样做:

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

代码很明显

于 2012-06-28T08:31:41.100 回答
0

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

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

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

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

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

添加.*到 2 结束以使其匹配 URL 的其余部分,加上(?i)开头以启用不区分大小写的匹配。

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

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

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

于 2012-06-28T08:40:51.920 回答