如何使用任何空白字符作为分隔符来拆分字符串

589

我需要传递什么正则表达式模式到java.lang.String.split()函数中,才能使用所有空格字符(' ''\t''\n'等)作为分隔符将字符串拆分为子字符串数组?

13个回答

999

大致上是这样的:

myString.split("\\s+");

这将把所有的空格作为分隔符。
所以,如果我有字符串:
"Hello[space character][tab character]World"

这应该会产生字符串"Hello""World",并省略[space][tab]之间的空格。

正如VonC所指出的那样,反斜杠应该被转义,因为Java首先会尝试将字符串转义为特殊字符,然后发送给解析器。你想要的是字面上的"\s",这意味着你需要传递"\\s"。这可能会有点令人困惑。

\\s等同于[ \\t\\n\\x0B\\f\\r]


1
谢谢你的提醒。我刚才是凭感觉编码 :) - Henrik Paul
43
请注意需要先使用 trim()trim().split("\\s++") - 否则,例如在拆分 a b c 时将会首先产生两个空字符串。 - Marcus Junius Brutus
你为什么在你的回答末尾附近使用了四个反斜杠?即 "\\\\s" - Michael Borkowski
"".trim().split("\s+") - 空字符串分割后长度为1。"term".trim().split("\s+") - 分割后长度同样为1。 - PaulSchell

91

在大多数正则表达式方言中,您可以使用一组方便的字符概述来实现此类操作 - 这些是值得记住的好方法:

\w - 匹配任何单词字符。

\W - 匹配任何非单词字符。

\s - 匹配任何空白字符。

\S - 匹配除空白字符外的任何内容。

\d - 匹配任何数字。

\D - 匹配除数字以外的任何内容。

搜索“正则表达式速查表”应该会给您带来许多有用的摘要。


2
有用的链接:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html - Michaël
阅读 Pattern 类的 JavaDoc:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html - Christophe Roussy

69

要在Javascript中使其工作,我必须执行以下操作:

myString.split(/\s+/g)

16
这是JavaScript代码。我也没有注意到 :) - miracle2k
16
不好意思,我的错误。也许这个答案仍然能够帮助一些在寻找JavaScript答案时偶然发现这篇帖子的人们。 :-) - Mike Manard
哈哈,我本来在寻找 JavaScript 的答案,无意中看到了这个问题,然后在离开之前注意到了你的回答。+1。 - Kris
太好了!我很高兴听到这个答案对某人有用,即使它回答的是错误的问题。 :-) - Mike Manard
这对我也非常有帮助,需要分割服务器参数 :) - amyiris

37
"

\\s+\"应该可以解决问题。

"

1
为什么要在末尾加上 + 号? - Floella
4
@Anarelle 它至少重复匹配空格字符一次,且尽可能多地匹配:请参见https://regex101.com/r/dT7wG9/1或http://rick.measham.id.au/paste/explain.pl?regex=\s%2B或http://regexper.com/#^s%2B 或http://www.myezapp.com/apps/dev/regexp/show.ws?regex=\s+&env=env_java - VonC

13

另外,您可能会遇到一个UniCode非断空格xA0...

String[] elements = s.split("[\\s\\xA0]+"); //include uniCode non-breaking

1
这帮助了我! - Surasin Tancharoen
确实,我也是。当我尝试更新索引别名时,在ElasticSearch的响应中发现了这个字符。简单的 \s+ 没有产生预期的效果。 - Investigator

10
String string = "Ram is going to school";
String[] arrayOfString = string.split("\\s+");

@Stephan 我没有看到那些。 - Arrow

9

3

你所需的是使用Java正则表达式引擎中特殊字符之一来拆分字符串,其中之一就是空白字符

  • \d代表数字:[0-9]
  • \D代表非数字:[^0-9]
  • \s代表空白字符,包括[ \t\n\x0B\f\r]
  • \S代表非空白字符: [^\s]
  • \v代表垂直空白字符:[\n\x0B\f\r\x85\u2028\u2029]
  • \V代表非垂直空白字符:[^\v]
  • \w代表单词字符:[a-zA-Z_0-9]
  • \W代表非单词字符:[^\w]

关键点在于小写字母\s代表所有类型的空白字符,包括单个空格[ ]、制表符[ ]或其他类似字符。

因此,如果你尝试像这样做-

String theString = "Java<a space><a tab>Programming"
String []allParts = theString.split("\\s+");

您将会获得所需的输出结果。

一些非常有用的链接:


希望这些能够对您最有帮助!


2

要使用任何Unicode空格来拆分字符串,您需要使用

s.split("(?U)\\s+")
         ^^^^
(?U)内联嵌入标志选项相当于Pattern.UNICODE_CHARACTER_CLASS,它使得\s简写字符类可以匹配来自空格Unicode类别的任何字符。
如果您想使用空格分割并在结果数组中保留空格,请使用:
s.split("(?U)(?<=\\s)(?=\\S)|(?<=\\S)(?=\\s)")

查看正则表达式演示。查看Java演示

String s = "Hello\t World\u00A0»";
System.out.println(Arrays.toString(s.split("(?U)\\s+"))); // => [Hello, World, »]
System.out.println(Arrays.toString(s.split("(?U)(?<=\\s)(?=\\S)|(?<=\\S)(?=\\s)")));
// => [Hello,    , World,  , »]

1
您可以使用以下语句按行分割字符串:
 String textStr[] = yourString.split("\\r?\\n");

你可以使用以下语句按空格拆分字符串:
String textStr[] = yourString.split("\\s+");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接