2012-12-13 37 views
0

所以我有一个很大的网站列表,我想把它们放在一个String变量中。我知道我不能单独去所有的链接,并逃避//,但是有超过几百个链接。有没有办法做一个“块转义”,所以在“块”之间的所有内容都逃脱了?这是我想要保存在变量中的一个例子。如何设置一个java字符串变量等于“htp://网站htp://网站”

String links="http://website http://website http://website http://website http://website http://website" 

也有人可以想到任何其他问题,我可能会遇到这样做吗?

我做了HTP而不是http因为我不允许我在这一水平是不张贴“超链接”,根据堆栈溢出:对

非常感谢

编辑:我做一个程序,因为我有大约50页的文档,里面充满了电子邮件和其他文字。我想过滤掉电子邮件。我写了这个程序来做到这一点非常简单,不是我只需要将这些页面存储在一个字符串变量中,程序将在其中运行。

+1

**为什么**在单个字符串中,而不是固定大小的'String []'每个索引有一个链接,或者一个动态的'java.util.List'? – jlordo

+6

你不需要转义*正向*斜杠,只有反斜杠需要转义。 – dasblinkenlight

+1

你在这里“逃避”是什么意思?你的意思是前缀与协议(即添加'“http://”'到'“网站网站的网站”?“(因为@dasblinkenlight说,如果你已经有''http:// website”',它不需要任何转义,如插入转义字符,如'\'。) – Amadan

回答

-1

我不确定你指的是什么样的'网站列表',但例如。一个以逗号分隔的网站文件,您可以读取整个文件并使用Stringsplit函数获取数组,或者可以使用BufferedReader逐行读取文件并将其添加到ArrayList

从那里,你可以简单的循环数组,并追加到String,或者如果您需要:

做一个“块逃亡”,所以一切都在“块”之间的转义

可以使用正则表达式根据图案来提取每个String的部分:

String oldString = "<someTag>I only want this part</someTag>"; 
String regExp = "(?i)(<someTag.*?>)(.+?)(</someTag>)"; 
String newString = oldString.replaceAll(regExp, "$2"); 

上面expressio n会删除由于"$2"而引起的xml标记,这意味着您对表达式的第二组感兴趣,其中组由圆括号()标识。 使用"$1$3"应该只给你周围的xml标签。

另一种更简单的方法来从String去除一定的“块”是Stringreplace函数,其中删除,你可以简单地传递一个空字符串作为新值的块。

我希望这些都有帮助,否则你可以尝试提供一个完整的例子,你输入“网站列表”和你想要的输出。

+0

看到这个:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

我没有试图建议他应该解析html或XML文档与正则表达式,我只是想给一个它的用法的例子:) – JGaarsdal

0

我建议你将你的Word文档保存为纯文本。然后您可以使用java.io包中的类(例如Scanner来阅读文本)。

要解决每次读取一行时覆盖String变量的问题,可以使用数组或ArrayList。这比将所有网址保存在一个String中更理想,因为您可以随时轻松访问每个地址。

2

你的问题写得不好。请改进它。按目前的格式,它将被封闭为“太模糊”。

是否要筛选电子邮件或网站?你的例子是关于网站,你关于电子邮件的文字。因为我不知道,我决定尽力帮助你,所以我决定做这两件事。

这里去代码:

private static final Pattern EMAIL_REGEX = 
     Pattern.compile("[A-Za-z0-9](:?(:?[_\\.\\-]?[a-zA-Z0-9]+)*)@(:?[A-Za-z0-9]+)(:?(:?[\\.\\-]?[a-zA-Z0-9]+)*)\\.(:?[A-Za-z]{2,})"); 

private static final Pattern WEBSITE_REGEX = 
     Pattern.compile("http(:?s?)://[_#\\.\\-/\\?&=a-zA-Z0-9]*"); 

public static String readFileAsString(String fileName) throws IOException { 
    File f = new File(fileName); 
    byte[] b = new byte[(int) f.length()]; 
    InputStream is = null; 
    try { 
     is = new FileInputStream(f); 
     is.read(b); 
     return new String(b, "UTF-8"); 
    } finally { 
     if (is != null) is.close(); 
    } 
} 

public static List<String> filterEmails(String everything) { 
    List<String> list = new ArrayList<String>(8192); 
    Matcher m = EMAIL_REGEX.matcher(everything); 
    while (m.find()) { 
     list.add(m.group()); 
    } 
    return list; 
} 

public static List<String> filterWebsites(String everything) { 
    List<String> list = new ArrayList<String>(8192); 
    Matcher m = WEBSITE_REGEX.matcher(everything); 
    while (m.find()) { 
     list.add(m.group()); 
    } 
    return list; 
} 

要确保它的工作原理,首先让测试filterEmails和filterWebsites方法:

public static void main(String[] args) { 
    System.out.println(filterEmails("Orange, pizza whatever else [email protected] a lot of text here. Blahblah blah with Luke Skywalker ([email protected]) hfkjdsh fhdsjf jdhf Paulo <[email protected]>")); 
    System.out.println(filterWebsites("Orange, pizza whatever else [email protected] a lot of text here. Blahblah blah with Luke Skywalker (http://luke.starwars.com/force) hfkjdsh fhdsjf jdhf Paulo <https://darth.vader/blackside?sith=true&midclorians> And the http://www.somewhere.com as x.")); 
} 

它输出:

[[email protected], [email protected], [email protected]] 
[http://luke.starwars.com/force, https://darth.vader/blackside?sith=true&midclorians, http://www.somewhere.com] 

测试readFileAsString方法:

public static void main(String[] args) { 
    System.out.println(readFileAsString("C:\\The_Path_To_Your_File\\SomeFile.txt")); 
} 

如果该文件存在,它的内容将被打印。

如果你不喜欢的事实,它返回List<String>不是与项目之间用空格分隔一String,这是简单的解决:

public static String collapse(List<String> list) { 
    StringBuilder sb = new StringBuilder(50 * list.size()); 
    for (String s : list) { 
     sb.append(" ").append(s); 
    } 
    sb.delete(0, 1); 
    return sb.toString(); 
} 

坚持一起:

String fileName = ...; 
String webSites = collapse(filterWebsites(readFileAsString(fileName))); 
String emails = collapse(filterEmails(readFileAsString(fileName))); 
0

对于你的第一个问题,把所有的文本都放在单词外面,把它放在正则表达式的东西里,用正则表达式来引用每行,并用+结束每一行。现在编辑最后一行并将+更改为;。在第一行上面写上String links =。将这个新文件复制到您的Java源代码中。 Here's an example using regexr

要回答第二个问题(考虑问题),如果我正确记得2^16的长度,则Java字符串文字的上限是有限制的。

哦和Perl基本上是为你做这样的事情(50页的文字,并分离出什么是网址和什么是电子邮件)......更不用说grep

相关问题