我想在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
如果你有更好的方法可以做到这一点。我认为在非常大的字符串上方法效率不高。
答案 0 :(得分:5)
尝试使用positive look-behind,一个不捕获其输入的正则表达式构造:
String s = "A#B^C&D!ased&acdf@Mhj%";
String temp[] = s.split("(?<=[#^&!@%]+)");
(?<=expr)
构造在expr
之后的点处匹配,而不捕获expr
本身,让您在分隔符后面的位置拆分文本。
答案 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的匹配,所以也许它应该是[#|^|&|!|@|%]