阅读HTML文件,按原样保留某些部分并翻译其他部分

时间:2015-02-14 22:59:11

标签: java

我正在尝试构建一个程序来读取HTML文件并将某些内容翻译成pig latin(保持相同的大小写,所有换行符和所有撇号)。我希望它忽略HTML标签,数字,标点符号和URL中的任何内容。

我想我已经接近了,我只是在寻找关于我应该使用哪些库方法以及我应该在哪里进行翻译的提示。

我意识到replaceAll方法是错误的。我希望有像replaceAll这样的东西,但是" ignoreALL"这可以忽略我不需要翻译的东西。

现在需要test.hmtl

<sdhfusidgfhdsfiugdfhghds9fuighdsfigudsf>3423423 JONES!

并返回:

ONES! 3423423 Jay

我希望它返回<sdhfusidgfhdsfiugdfhghds9fuighdsfigudsf>3423423 ONES!JAY

这是我到目前为止所拥有的:

import java.io.*;
import java.util.Scanner;
import java.util.Formatter;

public class test {

private test() {}

public static void main (String[] args) throws Exception{

 StringBuilder sb = new StringBuilder();

 BufferedReader br = new BufferedReader(new FileReader("test.html"));

 String line;

 while ( (line=br.readLine()) != null) {

     sb.append(line).append(System.getProperty("line.separator"));
 }

 String nohtml = sb.toString().replaceAll("\\<.*?>", "");


    final String vowels = "aeiouAEIOUy";


        String beforVowel = "";
        int cut = 0;
        while (cut < nohtml.length() && !vowels.contains("" + nohtml.charAt(cut)))
        {
            beforVowel += nohtml.charAt(cut);
            cut++;
        }
        if (cut == 0)
        {
            cut = 1;
            nohtml += nohtml.charAt(0) + "w";
        }
        System.out.println(nohtml.substring(cut) + beforVowel + "ay");


}

}

感谢任何指导。

1 个答案:

答案 0 :(得分:-1)

您可以split预览(?=subexpr)并将(?<=subexpr)(有效地描述regex)标记为标记,以zero-length delimiters html文件的内容和非标签,用另一个正则表达式<.*>区分两个组。

// read file into StringBuilder
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new FileReader("test.html"));
String line;
while ((line = br.readLine()) != null) {
    sb.append(line).append(System.getProperty("line.separator"));
}
String html = sb.toString();

// untangle tags and non-tags
String[] parts = html.split("(?<=>)|(?=<)");
for (int i = 0; i < parts.length; i++) {
    if (!parts[i].matches("<.*>")) {
        // translate words to pig latin
        parts[i] = parts[i].replaceAll(
            "\\b([AEOUIaeoui]+\\w*)\\b", "$1ay").replaceAll(
            "\\b([\\w&&[^AEOUIaeoui]]+)(\\w*?)\\b", "$2$1ay");
    }
}

// join parts back together
html = String.join("", parts);
System.out.println(html);

我不知道您的猪拉丁语的确切变体,但是\\b([AEOUIaeoui]+\\w*)\\b匹配由单词边界\\b包围的所有内容,这些内容以至少一个元音开头并以任何单词字符结尾。这被()(单词)和“ay”之间的字符所取代。

然后\\b([\\w&&[^AEOUIaeoui]]+)(\\w*?)\\b匹配以一个或多个单词字符开头的单词,除了元音后跟任何单词字符。 ?表示我们希望捕获尽可能少的字符,因此在第一组中捕获所有辅音。将其替换为第二组,然后是第一组,后跟“ay”。

join函数需要Java 8.如果必须使用较低版本,则需要自行完成。

注意:此方法同样会影响脚本部分,如果<和{{>&lt;&gt;未正确转义,则有时会失败1}}。例如。 <a href="#" title=">" class="special">a link</a>也会翻译class="special"