Java 从字符串实例中删除空白字符
有没有其他方法可以从字符串中删除空白字符 1) 据我所知,其他Java 从字符串实例中删除空白字符,java,regex,string,trim,Java,Regex,String,Trim,有没有其他方法可以从字符串中删除空白字符 1) 据我所知,其他 myString.trim() Pattern.compile("\\s"); 2) 当我使用时,是否还有其他原因搜索/寻找另一个/不同的方法?您只需使用myString.replaceAll(“\\s”,“”“)。但是: 请注意有关unicode空白的注释 以上内容将删除换行符。如果不希望删除换行符,请将其从正则表达式中排除 字符串。替换(“,”) (2) 也许为了性能调整,除此之外,我不知道Trim会删除ascii0和as
myString.trim()
Pattern.compile("\\s");
2) 当我使用时,是否还有其他原因搜索/寻找另一个/不同的方法?您只需使用
myString.replaceAll(“\\s”,“”“)
。但是:
- 请注意有关unicode空白的注释
- 以上内容将删除换行符。如果不希望删除换行符,请将其从正则表达式中排除
- 字符串。替换(“,”)
(2) 也许为了性能调整,除此之外,我不知道Trim会删除ascii0和ascii32之间的前导字符和尾随字符。这会删除大多数ASCII空白,但也会删除所有控制字符。它也不会在字符串中移除它们
for(int i=Character.MIN_CODE_POINT;i<=Character.MAX_CODE_POINT;i++)
if(Character.isWhitespace(i))
System.out.println(i);
for(int i=Character.MIN\u code\u POINT;i有一个预配置的for。它也可以与unicode一起使用
示例用法:
System.out.println(CharMatcher.whitespace().removeFrom("H \ne\tl\u200al \to "));
输出:
System.out.println(CharMatcher.whitespace().removeFrom("H \ne\tl\u200al \to "));
你好
CharMatcher还有许多其他不错的功能,我最喜欢的功能之一是该方法,它用一个字符替换多个出现:
System.out.println(
CharMatcher.whitespace().collapseFrom("H \ne\tl\u200al \to ", '*'));
输出:
System.out.println(CharMatcher.whitespace().removeFrom("H \ne\tl\u200al \to "));
你好*
继续寻找不同技术的原因是要找到一种能满足您真正需要的技术。例如,trim()
只删除字符串开头和结尾的空格。要使用正则表达式获得相同的效果,您必须执行以下操作:
s = s.replaceAll("^\\s+|\\s+$", "");
然后是删除哪些字符的问题。在Java 7之前,\s
只匹配ASCII空白字符,即:
"[\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020]"
…而(正如Peter所观察到的)trim()
简单地删除了代码点32处或以下的所有字符(U+0020
,采用Unicode表示法)。我怀疑这里的想法是,其他字符无论如何都不太可能出现在字符串中,如果它们出现了,您可能希望将它们删除。(不管怎么说,这对我很管用。☺) 但这是您应该注意的。下面的一些代码演示了trim()
和正则表达式方法之间的区别:
String s = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"
+ "\u0008\u0009\n\u000B\u000C\r\u000E\u000F"
+ "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017"
+ "\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F"
+ "\u0020\u00A0";
System.out.println(s.length());
System.out.println(s.trim().length());
System.out.println(s.replaceAll("\\s", "").length());
输出:
34
1
28
第二行输出中剩下的一个字符是不间断空格(U+00A0
,或“NBSP”),一旦超出ASCII范围,就会有更多的空白字符,但最有可能遇到的是NBSP.trim()
也不是正则表达式将其删除,但请注意当您将最后一行代码更改为以下内容时会发生什么:
System.out.println(s.replaceAll("(?U)\\s", "").length());
…并在Java 7下运行:
34
1
27
通过添加(?U)
,我打开了UNICODE\U CHARACTER\U CLASSES
模式,正如@tchrist在他的评论中所提到的。NBSP是一个空白字符,不管CHARACTER.isWhitespace()
怎么说,但这并不意味着你总是想在空白匹配中包含它。这就是为什么番石榴(由@Sean提到)还包括一个字符匹配器
总之,要选择正确的删除空白的工具,您需要确切地知道要删除哪些空白字符,以及要从何处删除这些字符。这并不复杂,但不像trim()这样的遗留工具那么简单
和StringTokenizer也假装是这样。我将一些代码从C#重新键入Java-我需要模拟XmlNode.OuterXml和XmlNode.InnerXml。为此,我使用了Transformer,但出于某种原因,即使关闭缩进,它也无法正确识别一些空白。因此,我的另一个选择是对字符串进行后处理使用以下两个等效调用之一,通过正则表达式生成回车、换行和制表符:
string.replaceAll("[\t\n\b\r\f]+ *", "");
string.replaceAll("[\\s+ *", "");
这两种方法都可以删除字符串和制表符中的任何空格。希望它至少有一点相关性。第二种方法可能是更好的选择您应该编写文字字符类;Java 1.7之前的UNICODE\u字符类
标志对于UNICODE空格是无效的。@tchrist,您的意思是“…\s
坏了…”?@Alan:对不起,它没有像\xA0
这样的东西。我最近看到很多这样的东西。@tchrist:不,我的意思是你的评论中似乎有一个打字错误;“\s
“不见了。@Alan:Ug你说得对。我不敢相信人类的思维倾向于看到它认为它看到的东西,而不是它在那里。控制字符
你是指行分隔符,EOF…,这个区域真的不是我喜欢的Java+1我的意思是^A,^B,^C到^W,^Y,^Z^[,^,^,^],^^^和^-+1这是Java中删除我们不需要的字符的最简单的方法。请注意,在代码中,您只删除了前导字符和尾随字符(请参见)是正确的,但出于效率原因,您可能需要使用myString.replaceAll(“\\s+”,”)
(注意+号)如果您有任何字符串包含大量串联的空白字符。正如我所看到的,我的问题的所有答案与我假设的方向不同,…我非常感谢您将所有答案放在一起,现在只有+1CharMatcher.WHITESPACE
从Guava 20.0开始就不推荐使用,CharMatcher.WHITESPACE()
是替代品。