我想将<
和>
替换为<
和>
,如果它不是html标记的一部分。
输入将是一个可能包含某些html标记的字符串。它还可以包含少于&amp;大于号(“&gt;”“&lt;”)。
例如:
String example1 = "-> <b> Bold </b> <-";
String example2 = "< <i> Italic </i> >"
String example3 = "<i>foo >> </i>"
作为输出我想得到:
String output1 = "-> <b> Bold </b> <-";
String output2 = "< <i> Italic </i> >";
String output3 = "<i>foo >> </i>";
所以replaceAll
不起作用,我猜我必须使用正则表达式匹配。有任何想法吗?其他一些方式?
注1:由于某些项目要求,第三方库不是一个选项 注2:我们仅支持HTML标记的一个子集(文本样式标记:斜体,下划线,粗体等)。
答案 0 :(得分:2)
这是一项非繁琐的任务。 HTML不是常规语言(可能是不规则的?)因此您无法使用正则表达式解析它。我建议如下:
如果您不需要保留空白区域,请使用此选项。
使用多字符前瞻处理每个输入行。
输入中的每个字符。转换字符为{“&gt;”,“&lt;”}
答案 1 :(得分:1)
如果您不能打扰使用外部库,那么您需要创建一个包含所有html标记的数组并对字符串运行它。
我不推荐它,因为有图书馆......
答案 2 :(得分:1)
如果您只支持五个html标记,则可以先从文本中删除这些标记。
替换&lt;和&gt;通过&lt;和&gt;然后再次添加html标记。您remove
&lt; b&gt;从文本中通过例如[b]替换它。对其他标签也一样。
答案 3 :(得分:0)
假设任意HTML文件,您必须隔离文本节点并对其运行replace
。
如果您不能使用现有的库,我只需编写自己的库。
(JSoup可以做到这一点,但它是一个'外部库' - 也就是说,不包含在Java SE标准中,但只是重新实现它是一种选择。)
答案 4 :(得分:0)
假设字符串包含有效HTML tags
。可以应用以下方法来解析字符串以获得您要查找的结果:
private static String parse(String str)
{
StringBuilder sBuilder = new StringBuilder();
for (int i = 0 ; i < str.length() ; i++)
{
char ch = str.charAt(i);
if (ch == '>' && i != 0)
{
char c = str.charAt( i - 1);
if (Character.isWhitespace(c) || !Character.isLetter(c))
{
sBuilder.append(">");
}
else
sBuilder.append(ch);
}
else if (ch == '>' && i==0)
{
sBuilder.append(">");
}
else if (ch == '<' && i < str.length() - 1)
{
char c = str.charAt( i + 1);
if (!(c=='/' || Character.isLetter(c)))
{
sBuilder.append("<");
}
else
sBuilder.append(ch);
}
else if (ch == '<' && i == str.length() - 1)
{
sBuilder.append("<");
}
else
{
sBuilder.append(ch);
}
}
return sBuilder.toString();
}