0

所以我有一个很大的网站列表,我想把它们都放在一个字符串变量中。我知道我不能单独访问所有链接并转义 //,但是有超过几百个链接。有没有办法进行“块转义”,所以“块”之间的所有东西都被转义了?这是我要保存在变量中的示例。

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

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

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

非常感谢

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

4

4 回答 4

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)));
于 2012-12-13T02:46:16.170 回答
0

对于您的第一个问题,从单词中取出所有文本,将其放入执行正则表达式的内容中,使用正则表达式引用每一行并以 . 结尾+。现在编辑最后一行并更改+;. 在第一行上面写String links =. 将此新文件复制到您的 java 源代码中。这是一个使用 regexr 的示例

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

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

于 2012-12-13T03:08:16.930 回答
0

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

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

于 2012-12-13T01:16:36.690 回答
-1

我不确定您指的是哪种“网站列表”,但例如。一个逗号分隔的网站文件,您可以读取整个文件并使用该String split函数获取一个数组,或者您可以使用 aBufferedReader逐行读取文件并添加到ArrayList.

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

做一个“块转义”,所以“块”之间的所有东西都被转义了

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

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

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

从 a 中删除某些“块”的另一种更简单的方法StringString replace函数,在哪里删除块你可以简单地传入一个空字符串作为新值。

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

于 2012-12-13T01:11:30.430 回答