也许我很愚蠢,但我不明白为什么StringTokenizer的行为在这里:
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
String object = (String) value;
String escaped = escapeHtml(object);
StringTokenizer tokenizer = new StringTokenizer(escaped, escapeHtml("<br/>"));
如果是fx。价值是
Hej<br/>$user.get(0).name Har vundet<br/><table border='1'><tr><th>Name</th><th>Played</th><th>Brewed</th></tr>#foreach( $u in $user )<tr><td>$u.name</td> <td>$u.played</td> <td>$u.brewed</td></tr>#end</table><br/>
然后结果是
Hej
$use
.
e
(0).name Ha
vunde
a
e
o
de
='1'
h
Name
h
h
P
ayed
h
h
B
ewed
h
#fo
each( $u in $use
)
d
$u.name
d
d
$u.p
ayed
d
d
$u.
ewed
d
#end
a
e
对我来说毫无意义。
我怎样才能让它按照我的预期行事。
答案 0 :(得分:8)
delim参数中的字符是用于分隔标记的分隔符。 分隔符本身不会被视为令牌。
换句话说,告诉StringTokenizer
何时分隔字符串的字符是:
当它匹配字符串中的任何字符(代码中的变量escaped
)时,StringTokenizer
实例将拆分结果并删除令牌。您可以通过注意输出中没有出现字母r
来确认这一点。
使用String.split
,而不是像其他人建议的那样。
答案 1 :(得分:2)
字符串中的每个字符都被视为用于拆分的标记。所以你的代码在每个“&amp;”,“l”,“t”,“;”,“b”,“r”,“/”或“g”字符上分开(因为escapeHtml
将取代“ &lt;“和”&gt;“分别带有<
和>
。
您可能希望使用String.split
将正则表达式作为要分割的东西:
String[] parts = object.split("<br/>");
或
String[] parts = escaped.split(escapeHtml("<br/>"));
请确保您的拆分令牌中没有正则表达式特殊字符。
答案 2 :(得分:1)
如果您想将字符串/文字除以一个单词而不仅仅是几个字符,那么最好使用String.split
我已经完成了测试:
public static void main(String[] args){
String s = "Hej<br/>$user.get(0).name Har vundet<br/><table border='1'><tr><th>Name</th><th>Played</th><th>Brewed</th></tr>#foreach( $u in $user )<tr><td>$u.name</td> <td>$u.played</td> <td>$u.brewed</td></tr>#end</table><br/>";
String[] lines = s.split("<br/>");
for(String ss:lines)
System.out.println(ss);
}
在这里你有结果:
Hej
$user.get(0).name Har vundet
<table border='1'><tr><th>Name</th><th>Played</th><th>Brewed</th></tr>#foreach( $u in $user )<tr><td>$u.name</td> <td>$u.played</td> <td>$u.brewed</td></tr>#end</table>
Tjena
答案 3 :(得分:0)
StringTokenizer使用每个字符进行拆分。
您需要使用拆分。 (虽然需要正则表达但要小心)
String[] lines = "some html string<br/>with line breaks<br/>".split("<br/>")
答案 4 :(得分:0)
您不能将StringTokenizer与多字符分隔符一起使用。解决问题的一种可能方法是将"<br>"
替换为您可以保证不会出现在字符串中的字符,然后使用该字符作为分隔符的StringTokenizer。