字符串标记

时间:2013-04-30 13:21:07

标签: java string split stringtokenizer

我想在java中使用其标记拆分字符串。 例如;

String s = "A#B^C&D!ased&acdf@Mhj%"
String temp[] = s.split("[#^&!@%]+");

Current output :-
temp[0] = A
temp[1] = B
temp[2] = C
temp[3] = D
temp[4] = ased

output which i want :-
temp[0] = A#
temp[1] = B^
temp[2] = C&
temp[3] = D!
temp[4] = ased&

My current approach of doing is 
  pos =  find the index of the token in string
  pos = add the size of the token in pos
  charAtPos  = getcharfrom string at index pos
  token = token + charAtPos  

如果你有更好的方法可以做到这一点。我认为在非常大的字符串上方法效率不高。

4 个答案:

答案 0 :(得分:5)

尝试使用positive look-behind,一个不捕获其输入的正则表达式构造:

String s = "A#B^C&D!ased&acdf@Mhj%";
String temp[] = s.split("(?<=[#^&!@%]+)");

(?<=expr)构造在expr之后的点处匹配,而不捕获expr本身,让您在分隔符后面的位置拆分文本。

这是demo on ideone

答案 1 :(得分:1)

String#split()使用正则表达式查找拆分位置,并从结果中删除匹配的组(这些是您通常不需要的标记)。如果你想获得令牌,你需要使用 look-aheads 后台进行零长度匹配。

String s = "A#B^C&D!ased&acdf@Mhj%"
String temp[] = s.split("(?<=[#^&!@%]+)");

更改表达式以匹配标记后的每个位置并创建零长度匹配。因此,结果也将包含令牌。

答案 2 :(得分:1)

如果你必须处理非常大的字符串,你最好滚动自己的代码。 Java模式匹配引擎是一个很好的通用工具,但通常可以通过自定义代码执行。

关键是使用类似Apache Commons StringUtils库的东西。这非常容易使用,并且标准Java词汇表中缺少大量函数。

功能:

i = StringUtils.indexOfAny("A#B^C&D!ased&acdf@Mhj%","[#^&!@%]+");

将获取第一个分隔符的索引。你可以在前面雕刻并迭代阵列。

答案 3 :(得分:0)

split方法拆分regexp的匹配,所以也许它应该是[#|^|&|!|@|%]