Java: 搜索将文本拆分为单独单词的正则表达式,包括字母、数字和字母之间的 '

Java: Searching for a Regex that splits a text into separate words, including letters, numbers and ' between letters

目前我有:text.split("[^\w+]" 但我还需要包括像这样的词:Can't 但不是像:'HEART'

我找不到将文本拆分为单词的解决方案,包括字母、数字和撇号(如果它位于其他字母之间)。谢谢

当出现 before/after 单词时去掉单个 quotes/apostrophes 可能更简单,然后使用排除撇号的初始定界符模式拆分:

String text = "Modern Talking's Hit:  'You're my heart, you're my soul', 1985";
String[] words = text.replaceAll("(?:^|\W)'|'(?:\W|$)", "").split("[^\w^']+");
System.out.println(Arrays.toString(words));

输出:

[Modern, Talking's, Hit, You're, my, heart, you're, my, soul, 1985]

您可以使用 PatternMatchResult 库来使用 \w+('\w+)? 正则表达式

列出您想要的单词,而不是拆分
import java.util.regex.Pattern;
import java.util.regex.MatchResult;

String regex = "\w+('\w+)?";
String text = "sampl'e 'text'";

String[] words = Pattern.compile(regex)
                          .matcher(text)
                          .results()
                          .map(MatchResult::group)
                          .toArray(String[]::new);

您也可以拆分为由撇号包围(或不包围)的空格

text.split("'?\s'?");

如果您想使用 \w 来匹配单词,而不是使用拆分,您可以使用单词边界并在左侧和右侧断言不是 '

\b(?<!')\w+(?:'\w+)*\b(?!')

在Java

String regex = "\b(?<!')\w+(?:'\w+)*\b(?!')";
String string = "Can't but not something like: 'HEART'";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(0));
}

输出

Can't
but
not
something
like