无法替换 Java 中的字符串

Trouble replacing strings in Java

如果我有这个字符串:

String line = "This, is Stack; Overflow.";

并希望将其拆分为以下字符串数组:

String[] array = ...

因此数组包含此输出:

["This",",","is","Stack",";","Overflow","."]

我应该在 split() 方法中放入什么正则表达式?

只需根据 space 或单词字符与非单词字符之间存在的边界拆分您的输入,反之亦然。

String s = "This, is Stack; Overflow.";
String parts[] = s.split("\s|(?<=\w)(?=\W)");
System.out.println(Arrays.toString(parts));

\s 匹配任何类型的白色space 字符,\w 匹配单词字符,\W 匹配非单词字符。

  • \s 匹配 space 个字符。
  • (?<=\w) 正向后视断言匹配之前必须有一个单词字符 (a-z, A-Z, 0-9, _)。
  • (?=\W) 断言匹配后必须跟一个非单词字符(单词字符以外的任何字符).所以这个 (?<=\w)(?=\W) 正则表达式只匹配边界而不匹配字符。

  • 因此根据匹配 spaces 和边界拆分输入将为您提供所需的输出。

DEMO

String s = "This, is Stack; Overflow.";
String parts[] = s.split("\s|(?<=\w)(?=\W)|(?<=[^\w\s])(?=\w)");
System.out.println(Arrays.toString(parts));

输出:

[This, ,, is, Stack, ;, Overflow, .]

你可以用这个模式来做:

\s+|(?<=\S)(?=[^\w\s])|(?<=[^\w\s])\b

它修剪空格并处理连续的特殊字符,示例:

;This, is Stack; ;; Overflow.

你获得:[";", "This", ",", "is", "Stack", ";", ";", ";", "Overflow", "."]

但显然,更有效的方法是不使用 split 方法,而是使用这种模式的 find 方法:

\w+|[^\w\s]