2

我想在 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  

如果你有更好的方法建议。我认为方法在非常大的 Strings 上效率不高。

4

4 回答 4

5

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

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

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

这是关于 ideone 的演示

于 2013-04-30T13:32:54.603 回答
1

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

关键是使用 Apache Commons StringUtils 库之类的东西。这非常易于使用,并且具有标准 Java 词汇表中缺少的大量功能。

功能:

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

将为您提供第一个分隔符的索引。由您决定从前面切出并迭代数组。

于 2013-04-30T13:39:22.000 回答
1

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

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

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

于 2013-04-30T13:25:29.243 回答
0

split 方法围绕正则表达式的匹配进行拆分,所以也许应该是[#|^|&|!|@|%]

于 2013-04-30T13:23:59.953 回答