我正在try 使用分隔符拆分字符串,对元素执行操作,然后使用相同的分隔符再次连接在一起.

String[] split = input.split(deli); // split on the string
// Do stuff with split
return String.join(delimiter,split); // join with the same string

This works fine, unless the used deli is '\t' (tab) (and probably other similar ones).
Because String.join refers to the delimiter as a 'charsequence' might this be the cause?

例如:

 var deli="\t";
 var split = data.split(deli); // splits properly
 var join = String.join(deli,split); // joins with sequence instead of char 
 var it = join.split(deli); // doesn't work

Is this normal? If so, how can I best work around it?
For now i'm doing this.

var deli="\t";
var split = data.split(deli); // splits properly
if( deli.equalsIgnoreCase("\\t")) 
     return String.join(String.valueOf((char)9),items);
return String.join(deli,items);

分隔符是从一个XML文件属性读取的,它被读取为"\\t",而不是"\t"(在ide调试中,它显示为\t).这是意料之中的,但因为分手总是奏效,所以从来没有想过这一点.

// First split works, second doesn't
    var input ="[2023-04-25 07:31:26.175]\t1\tgeneric:qsr2150|par\t1770.112, 10.25, 9.043";
    var deli = "\\t";
    String[] split = input.split(deli); // splits properly
    var join = String.join(deli,split);
    var split2 = join.split(deli); // doesn't split

// Both splits work
    var input ="[2023-04-25 07:31:26.175]\t1\tgeneric:qsr2150|par\t1770.112, 10.25, 9.043";
    var deli = "\t";
    String[] split = input.split(deli);
    var join = String.join(deli,split);
    var split2 = join.split(deli); // splits properly

所以我的问题的解决方案是将属性正确地转换为‘制表符’.

但是,为什么第一个分拆可行,而第二个分拆行不通?你本以为第一次分手就会失败.

推荐答案

背景就是一切.

  • "\t"是带有单制表符的字符串
  • "\\t"是包含反斜杠字符和小写‘t’字符的字符串
  • "\t"是包含字面制表符的正则表达式,它与输入中的制表符匹配
  • "\\t"是包含元字符\t的正则表达式,元字符\t与输入中的制表符匹配
  • "\\\\t"是包含2个反斜杠和小写‘t’字符的字符串.你可以通过执行Pattern.quote("\\t")来获得它.
  • "\\\\t"是一个正则表达式,它包含一个转义反斜杠和一个小写‘t’(\\t),后者匹配反斜杠后跟小写‘t’.

需要注意的重要一点是,基于regexString#split(String)个拆分:

将此字符串拆分为给定的regular expression个匹配项.

var input ="a\tb\tc"; // an 'a', a tab, a 'b', a tab, a 'c'
var deli = "\\t"; // a backslash and a 't'
String[] split = input.split(deli); // splits on the regex `\t`
var join = String.join(deli,split); // joins with backslash and t
// the value of join is now "a\\tb\\tc" (an 'a', a backslash, a 't', a 'b', a backslash, a 't', a 'c'
var split2 = join.split(deli); // the string does not contain any tabs anymore, so the regex matching tabs cannot split

如果输出变量joininput的值并对它们进行比较,您应该可以很容易地看到它们之间的差异.

Java相关问答推荐

Java字符串常数池困惑

如何在Docker容器中使用wireock—Webhooks阻止请求?

无法找到符号错误—Java—封装

@从类文件中删除JsonProperty—Java

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

Java中是否有某种类型的池可以避免重复最近的算术运算?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

当涉及到泛型时,类型推理在Java中是如何工作的?

如何从错误通道回复网关,使其不会挂起

Spring和可编辑";where";@Query

无法在Java中处理PayPal支付响应

Sack()步骤中的合并运算符未按预期工作

Domino Designer 14中的保存代理添加了重影库

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

为什么有两种实现来检索数组类的组件类型?

Java 21中泛型的不兼容更改

Java返回生成器的实现

获取月份';s在java中非UTC时区的开始时间和结束时间

更新不可变的深层嵌套字段

与其他带 @Primary 注释的 bean 发生冲突 (NoUniqueBeanDefinitionException)