如何连接不同格式的几个字符串然后拆分它们

时间:2012-07-17 10:54:22

标签: java string split concat


大家好。
我想在java中连接一些没有指定格式的字符串。例如,我想连接多个对象,如签名和BigInteger和字符串,所有这些对象都转换为字符串。所以我不能使用指定的分隔符,因为每个分隔符可能存在于这些字符串中。我如何连接这些字符串,然后拆分它们? 谢谢大家。

3 个答案:

答案 0 :(得分:3)

使用定义良好的格式,如XML或JSON。或者选择一个分隔符并在每个字符串中转义此分隔符的每个实例。或者在消息中添加每个部分的长度。例如:

10/7/14-<10 chars of signature><7 chars of BigInteger><14 chars of string>

10-<10 chars of signature>7-<7 chars of BigInteger>14-<14 chars of string>

答案 1 :(得分:1)

您可以转义字符串中的分隔符。例如,假设您有以下字符串:

String a = "abc;def";
String b = "12345:";
String c = "99;red:balloons";

你希望能够做这样的事情

String concat = a + delim + b + delim + c;
String[] tokens = concat.split(delim);

但是如果我们的delim是";"那么很明显这是不够的,因为我们将有5个令牌,而不是3.我们可以使用一组可能的分隔符,在字符串中搜索这些分隔符,然后使用不在目标字符串中的第一个,但这有两个问题。首先,我们如何知道使用了哪个分隔符?第二,如果字符串中存在所有分隔符,该怎么办?这不是一个有效的解决方案,而且肯定不是很强大。

我们可以通过使用转义分隔符来解决这个问题。让我们使用":"作为逃生分隔符。我们可以用它来说“下一个角色只是一个普通的老角色,它并不代表任何重要的东西。”

所以,如果我们这样做:

String aEscaped = a.replace(";",":;");
String bEscaped = b.replace(";",":;");
String cEscaped = c.replace(";",":;");

然后,我们可以将连接的字符串拆分为

String tokens = concat.split("[^:];")

但有一个问题:如果我们的文字实际包含":;"或以":"结尾怎么办?无论哪种方式,这些都会产生误报。在这种情况下,我们还必须逃避逃脱角色。它基本上和以前说的一样:“下一个角色没什么特别的。”

所以现在我们的转义字符串变为:

// note we escape our escape token first, otherwise we'll escape 
// real usages of the token
String aEscaped = a.replace(":","::").replace(";",":;");
String bEscaped = b.replace(":","::").replace(";",":;");
String cEscaped = c.replace(":","::").replace(";",":;");

现在,我们必须在正则表达式中考虑到这一点。如果有人知道一个适用于此的正则表达式,他们可以随意编辑它。我发生的事情就像concat.split("(::;|[^:];)"),但它似乎没有完成工作。解析它的工作非常简单。我为它扔了一个小的测试驱动程序,它似乎工作正常。

http://ideone.com/wUlyz

找到的代码

结果:

abc;def becomes abc:;def
ja:3fr becomes ja::3fr
; becomes :;
 becomes 
: becomes ::
83;:;:;;;; becomes 83:;:::;:::;:;:;:;
:; becomes :::;
Final product:
abc:;def;ja::3fr;:;;;::;83:;:::;:::;:;:;:;;:::;
Expected 'abc;def', Actual 'abc;def', Matches true
Expected 'ja:3fr', Actual 'ja:3fr', Matches true
Expected ';', Actual ';', Matches true
Expected '', Actual '', Matches true
Expected ':', Actual ':', Matches true
Expected '83;:;:;;;;', Actual '83;:;:;;;;', Matches true
Expected ':;', Actual ':;', Matches true

答案 2 :(得分:0)

使用连接运算符(+)进行连接,如下所示:

String str1 = "str1";
String str2 = "str2";
int inte = 2;

String result = str1+str2+inte;

但要将它们再次拆分,你需要一些特殊的字符作为分隔符,因为String中的split函数适用于分隔符。