我想在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
如果你有更好的方法建议。我认为这种方法在非常大的字符串上不是很有效
尝试使用正面查找,这是一个不捕获其输入的正则表达式结构:
String s = "A#B^C&D!ased&acdf@Mhj%";
String temp[] = s.split("(?<=[#^&!@%]+)");
(?<=expr)
结构匹配在expr
后面的点,而不捕获expr
本身,允许您在分隔符后面的位置拆分文本。
如果您必须处理非常大的字符串,您最好编写自己的代码。Java模式匹配引擎是一种很好的通用工具,但通常会被自定义代码超越。
关键是使用Apache Commons StringUtils库之类的东西。这非常容易使用,并且具有标准Java词汇表中缺少的大量函数。 函数:i = StringUtils.indexOfAny("A#B^C&D!ased&acdf@Mhj%","[#^&!@%]+");
将获得第一个分隔符的索引。这取决于您是否可以切掉前面并遍历数组。
String#split()
使用正则表达式查找分割位置,并将从结果中删除匹配组(这些是您通常不想要的令牌)。如果您也想获得令牌,则需要通过使用向前查找向后查找来进行零长度匹配。
String s = "A#B^C&D!ased&acdf@Mhj%"
String temp[] = s.split("(?<=[#^&!@%]+)");
表达式更改为匹配标记后的每个位置,并创建零长度匹配。因此,结果也将包含标记。
split方法拆分regexp的匹配,所以也许它应该是[#|^|&|!|@|%]