Java-Regex拆分输入文本,但保留分隔符

Java-Regex拆分输入文本,但保留分隔符,java,regex,Java,Regex,正在寻找一些正则表达式帮助。我正在寻找Java中的一种方法,可以将一些输入文本按单词分割,但同时保留分隔符(空格、标点符号)。另一种方法是将单词拆分为它们自己的索引,其他非单词字符可以位于数组的其他索引中 此输入文本: "Hello, this isn't working!" 应放入如下数组中: {"Hello", ",", "this", "isn't", "working", "!"} 或 我在Python中使用以下方法做了基本相同的事情: def split_input(string)

正在寻找一些正则表达式帮助。我正在寻找Java中的一种方法,可以将一些输入文本按单词分割,但同时保留分隔符(空格、标点符号)。另一种方法是将单词拆分为它们自己的索引,其他非单词字符可以位于数组的其他索引中

此输入文本:

"Hello, this isn't working!"
应放入如下数组中:

{"Hello", ",", "this", "isn't", "working", "!"}

我在Python中使用以下方法做了基本相同的事情:

def split_input(string):
    return re.findall(r"[\w']+|[\s.,!?;:-]", string)
但是我还没有找到一种方法来用Java完成同样的事情。我尝试了使用lookahead/lookahead的
String.split()


任何帮助都将不胜感激

split
不是Python的
findall
的Java模拟<代码>匹配器。查找是

Pattern stuff = Pattern.compile("[\\w']+|[\\s.,!?;:-]");
Matcher matcher = stuff.matcher("Hello, this isn't working!");
List<String> matchList = new ArrayList<String>();
while (matcher.find()) {
    matchList.add(matcher.group(0)); // add match to the list
}
Pattern stuff=Pattern.compile(“[\\w']+|[\\s,!?;:-]”);
Matcher-Matcher=stuff.Matcher(“你好,这没用!”);
列表匹配列表=新的ArrayList();
while(matcher.find()){
matchList.add(matcher.group(0));//将匹配项添加到列表中
}

split
不是Python的
findall
的Java模拟<代码>匹配器。查找是

Pattern stuff = Pattern.compile("[\\w']+|[\\s.,!?;:-]");
Matcher matcher = stuff.matcher("Hello, this isn't working!");
List<String> matchList = new ArrayList<String>();
while (matcher.find()) {
    matchList.add(matcher.group(0)); // add match to the list
}
Pattern stuff=Pattern.compile(“[\\w']+|[\\s,!?;:-]”);
Matcher-Matcher=stuff.Matcher(“你好,这没用!”);
列表匹配列表=新的ArrayList();
while(matcher.find()){
matchList.add(matcher.group(0));//将匹配项添加到列表中
}

所以,抛开你奇怪的例子不谈,这里有一些东西应该适合你的需要(有待测试):

第一个版本

"(?=[\\w']+|[\\s.,!?;:-]+)"
将几个分隔符作为一个整体保留


整个想法是,当你想要分割但保留所有字符时,只匹配位置。

因此,抛开你奇怪的例子,这里有一些东西应该适合你的需要(有待测试):

第一个版本

"(?=[\\w']+|[\\s.,!?;:-]+)"
将几个分隔符作为一个整体保留


整个想法是,当您想要分割但保留所有字符时,只匹配位置。

可能不是最好的方法,但您可以尝试:

string.replaceAll("([\\s.,!?;:-])", "$1\n");
string.split("\n");

也许这不是最好的方法,但您可以尝试:

string.replaceAll("([\\s.,!?;:-])", "$1\n");
string.split("\n");

试试这个:这正是你想要的

public static void main(String[] args) {
    String str = "Hello, this isn't working!";
    String[] s = str.split("(?<=\\s+|,\\s)");
    System.out.println(Arrays.toString(s));
}

试试这个:这正是你想要的

public static void main(String[] args) {
    String str = "Hello, this isn't working!";
    String[] s = str.split("(?<=\\s+|,\\s)");
    System.out.println(Arrays.toString(s));
}

如果空格是一个分隔符,那么你的文本应该产生至少4个元素,不是吗?为什么你想要一个数组,而其中只有一个字符串?如果空格是一个分隔符,那么你的文本应该产生至少4个元素,不是吗?为什么你想要一个数组,而其中只有一个字符串?啊,我确实尝试过使用Matcher,但没有走得太远。不过,这似乎做得很好,谢谢!这是非常非常有用的,谢谢,我确实尝试过使用Matcher,但没有走得太远。不过,这似乎做得很好,谢谢!这非常有用,谢谢