前言
技术不进则退,学无止境。
今天,我们来聊一下,字符串是如何剔除掉空格的。因为在很多时候,会用到这个功能。
字符串操作在编程时是最普通的操作。其中一个比较频繁的操作就是删除字符串文本中或字符串周围的空格。Jdk11 之前,我们都知道在Java中从字符串中删除空格的不同方法,即trim,replaceAll。但是,Java 11通过诸如strip,stripLeading和stripTrailing之类的方法对这些方法进行了一些新的添加。
在大多数情况下,我们只使用trim方法删除空格。是否有更好的方法来满足我们的需求?当然,trim()在大多数情况下都能很好地工作,但是java中有许多不同的方法。每种都有自己的优点和缺点。我们如何决定哪种方法最适合我们?
在Java中从字符串中删除空格的不同方法
总结了下,大概分为以下的方法:
- trim() :从字符串中删除前导和尾随空格
- strip() :删除字符串开头和结尾的空格。Strip方法支持Unicode字符集
- trim vs strip:trim与strip方法之间的差异
- stripLeading() :仅从字符串开头删除空格
- stripTrailing() :仅从字符串末尾删除空格
- replace() :用新字符替换所有目标字符
- replaceAll() :将所有匹配的字符替换为新字符。此方法将正则表达式作为输入,以标识需要替换的目标子字符串
- replaceAll vs replace :replace和replaceAll方法之间的区别
- replaceFirst() :仅使用新替换字符串替换第一次出现的目标子字符串
需要注意的最重要一点是,在Java中,字符串对象是不可变的。这意味着我们无法修改字符串,因此所有方法都将通过所有转换返回新字符串。
Java中的trim()方法
trim()是用来从字符串中提出前后空格最常用的操作方法。方法能够操作ASCII 值小于等于32 (‘U+0020’)的字符
public class StringTrimTest { public static void main(String[] args) { String string = " String with space "; System.out.println("格式化前: \"" + string +"\""); System.out.println("格式化后: \"" + string.trim() +"\""); } }
执行程序,输出结果:
格式化前: " String with space " 格式化后: "String with space"
jdk11,Java中的strip()方法
在Java 11发行版中,添加了新的strip()方法,以从String中删除前和后空格。
添加此方法的原因是,根据Unicode标准,存在各种空格字符,其ASCII值大于32('U + 0020')。例如:8193(U + 2001)。
为了识别这些空格字符,新方法是Java 1.5在Character类中添加了Whitespace(int)。此方法使用unicode识别空格字符。您可以在此处阅读有关Unicode空格字符的更多信息。
strip使用此Character.is Whitespace(int)方法覆盖范围广泛的空白字符并将其删除。
public class StringStripTest { public static void main(String[] args) { String string = " String with space "; System.out.println("格式化前: \"" + string+"\""); System.out.println("格式化后: \"" + string.strip()+"\""); } }
执行程序,输出结果:
格式化前: " String with space " 格式化后: "String with space"
strip vs trim
trim() | strip() |
自 Java 1 | 自 Java 11 |
使用(ASCII) 值 | 使用Unicode 值 |
移除首尾空格 | 移除首尾空格 |
移除ASCII码小于等于‘U+0020’ 或’32’空格字符 | 移除所有满足unicode的空格字符 |
让我们看一下示例,我们将使用大于32('U + 0020')unicode的空白字符。
public class StringTrimVsStripTest { public static void main(String[] args) { String string = '\u2001'+"String with space"+ '\u2001'; System.out.println("格式化前: \"" + string+"\""); System.out.println("trim 格式化后: \"" + string.trim()+"\""); System.out.println("strip 格式化后: \"" + string.strip()+"\""); } }
执行程序,输出结果:
格式化前: " String with space " trim 格式化后: " String with space " strip 格式化后: "String with space"
在上面的示例中,我们可以看到trim方法无法删除'\ u2001'unicode字符添加的空格字符。
注意:如果您在Windows计算机上运行,由于设置了有限的unicode,您可能看不到类似的输出。
Jdk11,Java中的stripLeading ( ) 方法
Java 11中添加了strip Leading()方法,以删除字符串中的所有前缀空格。
与strip方法类似,Strip Leading也使用Character.is Whitespace(int)来识别空白。
public class StringStripLeadingTest { public static void main(String[] args) { String string = " String with space "; System.out.println("格式化前: \"" + string+"\""); System.out.println("格式化后: \"" + string.stripLeading()+"\""); } }
执行程序,输出结果:
格式化前: " String with space " 格式化后: "String with space "
Jdk11,Java中的stripTrailing() 方法
strip Trailing()方法已在Java 11中添加,从字符串中删除了所有后缀空格。
与strip方法类似,Strip Trailing也使用Character.is Whitespace(int)来识别空白。
public class StringStripTrailingTest { public static void main(String[] args) { String string = " String with space "; System.out.println("格式化前: \"" + string+"\""); System.out.println("格式化后: \"" + string.stripTrailing()+"\""); } }
执行程序,输出结果:
格式化前:" String with space " 格式化后:" String with space"
replace(CharSequence target, CharSequence replacement):
从Java 1.5中添加,此方法用于将每个目标子字符串替换为指定的替换字符串。
此方法替换所有匹配的目标元素。
注意:java字符串类中提供了另一种方法replace(char旧的char,char新的char)。唯一的区别是此方法将单个字符用作目标和替换。我们不能使用此方法来删除空间,因为我们不能使用空字符作为替换。
public class StringReplaceTest { public static void main(String[] args) { String string = " String with space "; System.out.println("格式化前: \"" + string + "\""); System.out.println("格式化后: \"" + string.replace(" ", "") + "\""); } }
执行程序,输出结果:
格式化前: " String with space " 格式化后: "Stringwithspace"
replaceAll (String regex, String replacement)
在Java 1.4中添加,这是最强大的字符串处理方法之一。我们可以将这种方法用于许多目的。
使用replace All()方法,我们可以使用给定的替换字符串替换每个匹配的正则表达式子字符串。例如,删除所有空格,删除前导空格,删除尾随空格等等。
我们只需要创建带有正确替换参数的正确正则表达式即可。一些正则表达式示例如下:
\s+ | 匹配所有的空格 |
^\s+ | 匹配所有开始的空格 |
\s+$ | 匹配所有结束的空格 |
替换字符串中的空格的示例
注意:在Java中添加“ /”,我们必须使用转义符,因此对于“ \ s +”,我们必须使用“ \ s +”
public class StringReplaceAllTest { public static void main(String[] args) { String string = " String with space "; System.out.println("replaceAll执行前: \"" + string+"\""); System.out.println("替换所有的空格: \"" + string.replaceAll(" ", "") + "\""); System.out.println("按正则表达式替换所有的空格: \"" + string.replaceAll("\\s+", "") + "\""); System.out.println("按正则表达式替换头的空格: \"" + string.replaceAll("^\\s+", "") + "\""); System.out.println("按正则表达式替换尾的空格: \"" + string.replaceAll("\\s+$", "") + "\""); } }
执行程序,输出结果:
replaceAll执行前: " String with space " 替换所有的空格: "Stringwithspace" 按正则表达式替换所有的空格: "Stringwithspace" 按正则表达式替换头的空格: "String with space " 按正则表达式替换尾的空格:" String with space"
如我们所见,如果我们将其与正确的正则表达式一起使用,则replaceAll()替换功能非常强大。
replaceAll vs replace
replaceAll() | replace() |
自 Java 1.4 | 自Java 1.5 |
接受正则表达式为目标符 | 接受字符串为目标符 |
能够进行动态字符串替换 | 能够进行字符串替换 |
移除ASCII码小于等于‘U+0020’ 或’32’空格字符 | 移除所有满足unicode的空格字符 |
replaceFirst(String regex, String replacement)
Java 1.4中添加了``replaceFirst ''方法,仅将给定正则表达式的第一个匹配替换为替换字符串。
如果您只需要替换一个第一次出现的位置,则此方法非常有用。例如,如果我们只需要删除前导空格,则可以使用“ \ s +”或“ ^ \ s +”。
我们还可以使用此方法通过使用“ \ s + $”正则表达式删除尾随空格。因为此表达式将仅匹配行中的最后空格。因此,最后一个空格被视为此方法的第一个匹配项。
让我们举个例子,从字符串中删除前导和尾随空格
public class StringReplaceFistTest { public static void main(String[] args) { String string = " String with space "; System.out.println("替换前:\"" + string+"\""); System.out.println("替换:\"" + string.replaceFirst("space", "update") + "\""); System.out.println("替换头: \"" + string.replaceFirst("\\s+", "") + "\""); System.out.println("替换尾:\"" + string.replaceFirst("\\s+$", "") + "\""); } }
执行程序,输出结果:
替换前:" String with space " 替换:" String with update " 替换头: "String with space " 替换尾:" String with space"