使用java从字符串中删除额外的空白和不可见字符

使用java从字符串中删除额外的空白和不可见字符,java,string,apache-stringutils,Java,String,Apache Stringutils,我有一个大的对话,我处理它作为字符串之间的字符串有许多空白可能是无形的非文字字符也。 下面是一个示例字符串: public static void main(String[] args) { String str = " TWD day count Spot                              6-Sep / 2-Sep 2016 1W7d                        13-Sep / 9-Sep 2016 1M30d                 

我有一个大的对话,我处理它作为字符串之间的字符串有许多空白可能是无形的非文字字符也。 下面是一个示例字符串:

public static void main(String[] args) {
  String str = " TWD day count Spot                              6-Sep / 2-Sep 2016 1W7d                        13-Sep / 9-Sep 2016 1M30d                      6-Oct / 4-Oct 2016 2M62d                      7-Nov / 3-Nov 2016 3M91d                      6-Dec / 2-Dec 2016 6M181d                    6-Mar / 2-Mar 2017 9M273d                    6-Jun / 2-Jun 2017 12M365d                  6-Sep / 4-Sep 2017 18M546d                  6-Mar / 2-Mar 2018 24M730d                  6-Sep / 4-Sep 2018";
  str = str.toString().replaceAll(" +", "");
  System.out.println("str="+str.toString().trim().replaceAll(" ", ""));
}
我尝试了许多字符串函数来删除空白,如
trim()
replaceAll(“,”)
replaceAll(“\\s”,“”“)
replaceAll(“+”,”)
replaceAll(\\s\\u00a0“,”)
stringUtils.normalize()
函数等。我尝试了许多函数,但没有按预期工作

我期望输出如下:

System.out.println("str="+str.replaceAll("(?U)\\s+", " "));
“String str=“TWD日盘点点2016年9月6日/9月2日1周7日9月13日/ 2016年9月9日2016年10月6日/4日2016年10月2日2016年11月7日/3日 3M91d 2016年12月6日/2日6M181d 2017年3月6日/2日9M273d“

只有一个空格,而不是长的白色重复空格

请帮忙

找到的答案如下:

System.out.println("str="+str.replaceAll("(?U)\\s+", " "));
输出:

TWD day count Spot 6-Sep / 2-Sep 2016 1W7d 13-Sep / 9-Sep 2016 1M30d 6-Oct / 4-Oct 2016 2M62d 7-Nov / 3-Nov 2016 3M91d 6-Dec / 2-Dec 2016 6M181d 6-Mar / 2-Mar 2017 9M273d 6-Jun / 2-Jun 2017 12M365d 6-Sep / 4-Sep 2017 18M546d 6-Mar / 2-Mar 2018 24M730d 6-Sep / 4-Sep 2018 TWD日计数点2016年9月6日2016年9月2日1W7d 2016年9月13日2016年10月6日2016年10月4日2M62d 2016年11月7日2016年11月3日3M91d 2016年12月6日2016年12月2日6M181d 2017年3月6日2017年6月2日9M273d 2017年9月6日2017年9月4日18M546d 2018年3月6日2018年3月2日24M730d 2018年9月6日2018年9月4日 输出:

TWD day count Spot 6-Sep / 2-Sep 2016 1W7d 13-Sep / 9-Sep 2016 1M30d 6-Oct / 4-Oct 2016 2M62d 7-Nov / 3-Nov 2016 3M91d 6-Dec / 2-Dec 2016 6M181d 6-Mar / 2-Mar 2017 9M273d 6-Jun / 2-Jun 2017 12M365d 6-Sep / 4-Sep 2017 18M546d 6-Mar / 2-Mar 2018 24M730d 6-Sep / 4-Sep 2018
TWD日计数点2016年9月6日2016年9月2日1W7d 2016年9月13日2016年10月4日2016年10月6日2016年11月3日2016年11月7日3M91d 2016年12月2日6M181d 2017年3月6日2017年6月2日9M273d 2017年6月6日2017年9月4日18M546d 2018年3月2日24M730d 2018年9月6日e类别:

  • ,例如,
    \u00A0
    (无中断空格)、
    \u2003
    (EM空格)
  • ,即
    \u2029
    (段落分隔符)
  • ,即
    \u2028
    (行分隔符)
使用以下命令:

str = str.replaceAll("[\\s\\p{Z}]+", " ").trim();
其中,
\s
匹配空格字符(
[\t\n\x0B\f\r]
),而
\p{Z}
是上面列出的
\p{Zs}\p{Zp}\p{Zl}
的缩写


它基本上将所有空格和分隔符替换为空格,将连续空格折叠为单个空格,并删除前导空格和尾随空格。

如果文本中有非标准空格,例如Unicode类别中的字符:

  • ,例如,
    \u00A0
    (无中断空格)、
    \u2003
    (EM空格)
  • ,即
    \u2029
    (段落分隔符)
  • ,即
    \u2028
    (行分隔符)
使用以下命令:

str = str.replaceAll("[\\s\\p{Z}]+", " ").trim();
其中,
\s
匹配空格字符(
[\t\n\x0B\f\r]
),而
\p{Z}
是上面列出的
\p{Zs}\p{Zp}\p{Zl}
的缩写


它基本上将所有空格和分隔符替换为空格,将连续空格折叠为单个空格,并删除前导空格和尾随空格。

str
已经是
字符串时,
str.toString()
的意义是什么?---什么是
.trim().replaceAll(“,”)
replaceAll
仍将删除前导空格和尾随空格时?除非您解释确切的问题,否则无法按预期工作,我们所能做的就是重复相同的建议。可能
System.out.println(“str=“+str.replaceAll”(\\s+));
@Andreas我同意,刚刚删除了我的答案,并对你的答案投了赞成票。当
str
已经是一个
字符串时,
str.toString()
的意义是什么
replaceAll
将删除前导空格和尾随空格时?除非您解释确切的问题,否则无法按预期工作,我们所能做的就是重复相同的建议。可能是
System.out.println(“str=“+str.replaceAll”(\\s+”,“”);
@Andreas我同意,只是删除了我的答案,并对你的答案投了赞成票。