3

使用 split() 时,什么正则表达式可以让我保留所有单词字符,但也可以保留像 don't won't 这样的缩写。撇号两侧带有单词字符但删除任何前导或尾随撇号的任何内容,例如“tis or dogs”。

我有:

String [] words = line.split("[^\\w'+]+[\\w+('*?)\\w+]");

但它保留了前导和尾随标点符号。

的输入'Tis the season, for the children's happiness'.

将产生以下输出:Tis the season for the children's happiness

有什么建议吗?

4

3 回答 3

0

我会认为:分裂:

  • 撇号 + 至少一个无字char['-]\\W+
  • 任何无字字符[^\\w'-]\\W*

    String line = "'Tis the season, for the children's happiness'";
    String[] words = line.split("(['-]\\W+|[^\\w'-]\\W*)");
    System.out.println(Arrays.toString(words));
    

在这里,我添加-了撇号。

结果:

['Tis, the, season, for, the, children's, happiness']

添加开始和结束:

    String[] words = line.split("(^['-]|['-]$|['-]\\W+|[^\\w'-]\\W*)");

结果:

[, Tis, the, season, for, the, children's, happiness]

一开始会产生一个空字符串。

于 2012-12-10T00:10:10.970 回答
0

或者,您可以只匹配模式:

\w+('\w+)?
于 2012-12-10T01:51:04.563 回答
0

英语很烂。考虑以下伦敦:

“简说,‘你会很吓人的,山姆带着南瓜灯的儿子!’”双胞胎的鬼魂异口同声地说。

所有单词都使用以下方式匹配:

('?[\p{L}](-[^-])?('-)?(s'(?=\s))?)+

返回 16 个匹配项:

Jane said,‘ 'E'll be spooky,!Sam's son with the jack-o'-lantern’,” said the twins' ghosts—— in unison

请注意,twins'是所有格,而不是收缩,并且是匹配的。然而,Sam's也是所有格,但与收缩没有区别——它需要一个精心设计的例外条款,因为不是它的所有格:它是的。

这将不包括“幸福”中的撇号,因为没有简单的方法来判断它是结束单引号还是所有格。

请参阅我的引号解析器KeenQuotes,它将通过将直引号字符 ( ') 转换为撇号 ( ') 或卷曲单引号 ( ‘, ’) 来处理许多场景。

于 2021-04-18T21:06:10.357 回答