我在一个大文件(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());
}
}
答案 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”,并且您希望使搜索更精细,则必须进行更多调整。