Java 阅读HTML文件,保持某些部分不变,并翻译其他部分
我正在尝试构建一个程序,读取HTML文件,并将某些内容翻译成pig拉丁语(保持大小写不变,所有换行符和撇号)。我希望它忽略HTML标记、数字、标点符号和URL中的任何内容 我想我已经接近了,我只是在寻找关于我应该使用什么库方法以及应该在哪里进行翻译的提示 我意识到replaceAll方法是错误的。我希望有像replaceAll但“ignoreALL”这样的东西可以忽略我不需要翻译的东西 现在需要一个Java 阅读HTML文件,保持某些部分不变,并翻译其他部分,java,Java,我正在尝试构建一个程序,读取HTML文件,并将某些内容翻译成pig拉丁语(保持大小写不变,所有换行符和撇号)。我希望它忽略HTML标记、数字、标点符号和URL中的任何内容 我想我已经接近了,我只是在寻找关于我应该使用什么库方法以及应该在哪里进行翻译的提示 我意识到replaceAll方法是错误的。我希望有像replaceAll但“ignoreALL”这样的东西可以忽略我不需要翻译的东西 现在需要一个test.hmtl测试: 3423423琼斯 并返回: 一个! 3423423 Jay 我希望它返
test.hmtl
测试:
3423423琼斯代码>
并返回:
一个!
3423423 Jay
我希望它返回3423423个!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");
}
}
import java.io.*;
导入java.util.Scanner;
导入java.util.Formatter;
公开课考试{
私有测试(){}
公共静态void main(字符串[]args)引发异常{
StringBuilder sb=新的StringBuilder();
BufferedReader br=新的BufferedReader(新的文件阅读器(“test.html”);
弦线;
而((line=br.readLine())!=null){
sb.append(line.append(System.getProperty(“line.separator”));
}
字符串nohtml=sb.toString().replaceAll(“\\”,”);
最后的字符串元音=“aeiouAEIOUy”;
元音“”之前的字符串;
int-cut=0;
while(cut
谢谢您的指导。您可以使用“向前看”(?=subexpr)
和“向后看”(?您可能需要一个HTML解析器。@immibis我不想下载任何外部解析器。如果您提出该约束并使用XPath或XSLT来完成此工作,您会发现这将非常容易。有一位投票人可以在这里给出一个解释吗?谢谢您的帮助,但我不确定这是否可行。我现在正在玩它,但是我需要访问各个部分(单词、片段、URL等)在html文件的每一行中,查看它们是否符合被翻译的条件。我的原始帖子可能会让人困惑,或者可能我做错了什么。我将实际翻译添加到了我的答案中--请查看。好吧,这太棒了。我对regex不是很熟悉,但这肯定是我想要的。我会尝试一下,但我不知道猜我在拆分后的括号内添加了我想忽略的所有内容?因此,如果我想忽略数字,我将为它们创建一个正则表达式,并将它们添加到“|”之后?谢谢!不,这将拆分
之前和之后的字符串。忽略数字(或者更具体地说,只匹配“真实”单词)尝试通过将(\\w*?)
替换为(\\w+?)
,确保以非元音开头的每个匹配项至少包含一个单词字符。如果您对正则表达式不太熟悉,请毫不犹豫地阅读一些教程。
// 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);