大家好。
我想在java中连接一些没有指定格式的字符串。例如,我想连接多个对象,如签名和 BigInteger 和字符串,所有这些对象都转换为字符串。所以我不能使用指定的分隔符,因为每个分隔符都可能存在于这些字符串中。我如何连接这些字符串然后拆分它们?
谢谢大家。
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>
您可以转义字符串中的分隔符。例如,假设您有以下字符串:
String a = "abc;def";
String b = "12345:";
String c = "99;red:balloons";
你希望能够做这样的事情
String concat = a + delim + b + delim + c;
String[] tokens = concat.split(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("(::;|[^:];)")
,但似乎并没有完成工作。解析它的工作将非常容易。我为它拼凑了一个小型测试驱动程序,它似乎工作得很好。
结果:
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
您可以使用连接运算符 ( +
) 进行连接,如下所示:
String str1 = "str1";
String str2 = "str2";
int inte = 2;
String result = str1+str2+inte;
但是要再次拆分它们,您需要一些特殊字符作为分隔符,因为 String 中的拆分函数适用于分隔符。