【发布时间】:2017-02-17 14:16:47
【问题描述】:
有一个字符串
String str = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
如何将它拆分成这样的字符串 “ggg;ggg;” “nnn;nnn;” “啊啊;啊啊;” “xxx;xxx;” ???????
【问题讨论】:
-
一种方法是在每个分隔符处拆分它,然后重新组合成对。另一种方法是编写一个显式的有限状态机。
标签: java
有一个字符串
String str = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
如何将它拆分成这样的字符串 “ggg;ggg;” “nnn;nnn;” “啊啊;啊啊;” “xxx;xxx;” ???????
【问题讨论】:
标签: java
拆分并加入他们。
public static void main(String[] args) throws Exception {
String data = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
String del = ";";
int splitSize = 2;
StringBuilder sb = new StringBuilder();
for (Iterable<String> iterable : Iterables.partition(Splitter.on(del).split(data), splitSize)) {
sb.append("\"").append(Joiner.on(del).join(iterable)).append(";\"");
}
sb.delete(sb.length()-3, sb.length());
System.out.println(sb.toString());
}
【讨论】:
其他一些答案,仅适用于您的特定示例输入。
你看,在你的例子中,有两个相似之处:
换句话说:如果您的所有输入都真正满足这两个属性,您可以避免拆分 - 因为您知道确切在您的每个位置可以找到什么细绳。
当然,遵循“真实”拆分的其他答案更灵活;但是(理论上),您可以继续进行一系列子字符串调用,以便直接访问所有元素。
【讨论】:
使用Regex
String input = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
Pattern p = Pattern.compile("([a-z]{3});\\1;");
Matcher m = p.matcher(input);
while (m.find())
// m.group(0) is the result
System.out.println(m.group(0));
会输出
ggg;ggg;
nnn;nnn;
aaa;aaa;
xxx;xxx;
【讨论】:
我假设您只想检查最后一段是否相似,而不是每个已读取的段。
如果不是这样,那么您可能必须使用ArrayList 而不是Stack。
我还假设每个段的格式为/([a-z])\1\1/。
如果不是这种情况,那么您应该将 if 语句更改为:
(stack.peek().substring(0,index).equals(temp))
public static Stack<String> splitString(String text, char split) {
Stack<String> stack = new Stack<String>();
int index = text.indexOf(split);
while (index != -1) {
String temp = text.substring(0, index);
if (!stack.isEmpty()) {
if (stack.peek().charAt(0) == temp.charAt(0)) {
temp = stack.pop() + split + temp;
}
}
stack.push(temp);
text = text.substring(index + 1);
index = text.indexOf(split);
}
return stack;
}
【讨论】:
将 split 与正则表达式一起使用:
String data="ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
String [] array=data.split("(?<=\\G\\S\\S\\S;\\S\\S\\S);");
【讨论】: