从字符串中提取单词的正则表达式

3
我想从Java字符串中提取所有单词。
单词可以用任何欧洲语言书写,不包含空格,只有字母符号。
它可以包含连字符。

5
“o'clock”是一个单词吗?“Modula-2”是一个单词吗? - kennytm
x'x'x'是一个“单词”吗? zexcqcewqxc-trmnbynmtrby呢? - polygenelubricants
@polygenelubricants 他们是。在最简单的情况下。 - EugeneP
不,绝对不能在任何单词中出现[0-9]。Modula-2不是一个单词。 - EugeneP
3个回答

3
如果您不想使用正则表达式,也可以看一下BreakIterator,特别是getWordInstance()方法:
单词边界分析被用于搜索和替换函数,以及允许用户双击选择单词的文本编辑应用程序中。单词选择提供了对单词内部和后面的标点符号的正确解释。不属于单词的字符,如符号或标点符号,在两侧都有单词分界点。

2
您可以使用 (?<!\S)\S+(?!\S) 的变体,即任何非空格字符的最大序列。
  • 负面向前环视用于匹配字符串开头和结尾的“单词”
  • 将自己的字符类替换为 \S,以查找更具特定性的内容
    • (例如,[A-Za-z-]等)
下面是一个简单的示例来说明这个想法,使用 [a-z-] 作为字母表字符类:
    String text = "--xx128736f-afasdf2137asdf-12387-kjs-23xx--";
    Pattern p = Pattern.compile(
        "(?<!alpha)alpha+(?!alpha)".replace("alpha", "[a-z-]")
    );
    Matcher m = p.matcher(text);
    while (m.find()) {
        System.out.println(m.group());
    }

这将打印:

--xx
f-afasdf
asdf-
-kjs-
xx--

参考资料


但是字母表应该是什么?

你可能需要使用Unicode字符类等(请耐心等待,我正在研究这个话题)。


嗯,我觉得这个答案实际上没有什么意义。(?<!alpha)alpha+(?!alpha) 就是 alpha+。我可能会删除它。有反馈吗? - polygenelubricants
它正在执行某些操作,因为它会输出一些内容。等待您的最终解决方案,以便查看其运作情况。 - EugeneP

0

这将匹配单个单词:

`([^\s]+)`

1
那要根据“单词”的定义而定。此外,它将匹配空字符串。如果你想捕获它,\S+更好,或者使用(\S+) - Christoffer Hammarström
你的正则表达式肯定匹配一个或多个空格字符吧? - Eric
1
\s 匹配空格,\S 匹配非空格字符。 - Christoffer Hammarström

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