如何设置一个等于“htp:// website htp:// website”的java字符串变量

所以我有一个很大的网站列表,我想把它们全部放在一个String变量中。 我知道我无法单独访问所有链接并逃脱//,但是有超过几百个链接。 有没有办法进行“块逃逸”,所以“块”之间的所有内容都被转义了? 这是我想要在变量中保存的示例。

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

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

我做了htp而不是http,因为我不允许根据堆栈溢出发布“超链接”,因为我不在那个级别:p

非常感谢

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

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

您想过滤电子邮件或网站吗? 您的示例是关于网站,您发送有关电子邮件的文本。 我不知道,无论如何我决定试着帮助你,我决定两个都做。

这里是代码:

 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 filterEmails(String everything) { List list = new ArrayList(8192); Matcher m = EMAIL_REGEX.matcher(everything); while (m.find()) { list.add(m.group()); } return list; } public static List filterWebsites(String everything) { List list = new ArrayList(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 joe@somewhere.com a lot of text here. Blahblah blah with Luke Skywalker (luke@starwars.com) hfkjdsh fhdsjf jdhf Paulo ")); System.out.println(filterWebsites("Orange, pizza whatever else joe@somewhere.com a lot of text here. Blahblah blah with Luke Skywalker (http://luke.starwars.com/force) hfkjdsh fhdsjf jdhf Paulo  And the http://www.somewhere.com as x.")); } 

它输出:

 [joe@somewhere.com, luke@starwars.com, aaa.aaa@bgf-ret.com.br] [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的事实,这很容易解决:

 public static String collapse(List 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))); 

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

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

对于你的第一个问题,把所有文本都用在单词中,把它放在做正则表达式的东西中,使用正则表达式引用每一行并用+结束每一行。 现在编辑最后一行并将+更改为; 。 在第一行上方写String links = 。 将此新文件复制到您的Java源代码中。 这是使用regexr的示例 。

要回答你的第二个问题(思考问题),如果我记得2 ^ 16的长度,那么Java字符串文字有一个上限。

哦, Perl基本上是为你写的做这种事情(拿50页的文字分开什么是url和什么是电子邮件)…更不用说grep

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

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

做一个“块逃脱”,所以“块”之间的所有内容都被转义

您可以使用正则表达式根据模式提取每个String部分:

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

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

String删除某些“块”的另一种更简单的方法是String replace函数,在那里删除块,您可以简单地将空字符串作为新值传递。

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