0

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

此输入文本:

"Hello, this isn't working!"

应该像这样放入一个数组中:

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

或者

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

我在 Python 中使用它完成了基本相同的事情:

def split_input(string):
    return re.findall(r"[\w']+|[\s.,!?;:-]", string)

但我还没有找到一种方法在 Java 中完成同样的事情。我尝试String.split()过前瞻/后视,也尝试过模式匹配器,但运气不佳。

任何帮助将非常感激!

4

4 回答 4

5

split不是 Python 的 Java 类比findallMatcher.find是。

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
}
于 2013-04-08T12:57:47.207 回答
1

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

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));
}

输出:

[Hello, , this , isn't , working!]
于 2013-04-08T13:09:44.630 回答
0

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

"(?=[\\w']+|[\\s.,!?;:-])"

对于第一个版本。

"(?=[\\w']+|[\\s.,!?;:-]+)"

将多个分隔符保留为一个整体。

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

于 2013-04-08T13:00:04.077 回答
0

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

string.replaceAll("([\\s.,!?;:-])", "$1\n");
string.split("\n");
于 2013-04-08T13:00:39.313 回答