所以我有一个很大的网站列表,我想把它们全部放在一个String变量中。我知道我不能单独去所有链接并逃脱//,但是有几百个链接。有没有办法进行“块逃逸”,所以“块”之间的所有内容都被转义了?这是我想要保存在变量中的示例。
String links="http://website http://website http://website http://website http://website http://website"
也可以有人想到我这样做时可能遇到的任何其他问题吗?
我做了htp而不是http,因为我不允许根据堆栈溢出发布“超链接”,因为我不在那个级别:p
非常感谢
编辑:我正在编写一个程序,因为我有大约50页的单词文档,其中包含电子邮件和其他文本。我想过滤掉电子邮件。我编写了程序来完成这个非常简单的操作,而不是我只需要将页面存储在运行程序的字符串变量中。
答案 0 :(得分: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 joe@somewhere.com a lot of text here. Blahblah blah with Luke Skywalker (luke@starwars.com) hfkjdsh fhdsjf jdhf Paulo <aaa.aaa@bgf-ret.com.br>"));
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 <https://darth.vader/blackside?sith=true&midclorians> 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>
而不是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)));
答案 1 :(得分:0)
我建议您将Word文档保存为纯文本。然后,您可以使用java.io
包中的类(例如Scanner
来阅读文本)。
要解决每次读取行时覆盖String
变量的问题,可以使用数组或ArrayList
。这比在一个String
中保留所有网址更为理想,因为您可以随时轻松访问每个地址。
答案 2 :(得分:0)
对于你的第一个问题,把所有的文字都拿出来,把它放在做正则表达式的东西中,用正则表达式引用每一行,并用+
结束每一行。现在编辑最后一行并将+
更改为;
。在第一行上方写String links =
。将此新文件复制到您的Java源代码中。
这是an example using regexr。
要回答你的第二个问题(想到问题),如果我记得2 ^ 16的长度正确,那么Java字符串文字有一个上限。
哦,Perl
基本上是为你写的那样做的(拿50页的文字分开是什么网址和什么是电子邮件)......更不用说{{3} }。
答案 3 :(得分:-1)
我不确定你指的是什么样的'网站列表',但是例如。一个逗号分隔的网站文件,您可以读取整个文件并使用String
split
函数来获取数组,或者您可以使用BufferedReader
逐行读取文件添加到ArrayList
。
从那里你可以简单地循环数组并附加到String
,或者如果你需要:
执行“阻止转义”,因此“阻止”之间的所有内容都会被转义
您可以使用正则表达式根据模式提取每个String
的部分:
String oldString = "<someTag>I only want this part</someTag>";
String regExp = "(?i)(<someTag.*?>)(.+?)(</someTag>)";
String newString = oldString.replaceAll(regExp, "$2");
上面的表达式将删除由"$2"
引起的xml标记,这意味着您对表达式的第二组感兴趣,其中组由圆括号( )
标识。
然后使用"$1$3"
应该只为您提供周围的xml标记。
从String
移除某些“块”的另一种更简单的方法是String
replace
函数,在这里删除块,你可以简单地传入一个空字符串作为新的值。
我希望这有任何帮助,否则你可以尝试提供一个完整的例子,你输入“网站列表”和你想要的输出。