0

我目前正在尝试过滤包含用“-”分隔的单词的文本文件。我想数单词。

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

简单地出现的问题是:包含“-”的单词将被分开并计为两个单词。所以只是用 \- 转义不是选择的解决方案。

如何更改分隔符表达式,以便保留“foo-bar”之类的词,但单独的“-”会被过滤掉并忽略?

谢谢 ;)

4

5 回答 5

1

好的,我在这里猜你的问题:你的意思是你有一个带有一些“真实”散文的文本文件,即实际上有意义的句子,用标点符号等分隔,对吧?

例子:

就我们所知,这种情况得到了改善,因为我们最信任的盟友 Vorgons 继续举办他们的诗歌大满贯比赛。敌人几乎没有动机去干涉,即使他们的 Mute-O-Matic 设备也是如此。

因此,您需要作为分隔符的东西是任意数量的空格和/或标点符号(您已经用您展示的正则表达式覆盖),或者每边至少被一个空格包围的连字符。“或”的正则表达式字符是“|”。在许多正则表达式实现中,空白字符类(空格、制表符和换行符)都有一个快捷方式:“\s”。

"[.,:;()?!\"\s]+|\s+-\s+"
于 2009-04-15T10:16:24.447 回答
0

这不是很简单。要尝试的一件事是 {current-delimeter-chars}{zero-or-more-hyphens}{zero-or-more-current-delimeter-chars-or-hyphen}。

忽略扫描仪返回的完全由连字符组成的单词可能更容易

于 2009-04-15T10:10:14.867 回答
0

如果可能,请尝试使用预定义的类...使正则表达式更易于阅读。有关选项,请参见 java.util.regex.Pattern。

也许这就是你正在寻找的:

string.split("\\s+(\\W*\\s)?"

读取:匹配 1 个或多个空白字符,可选地后跟零个或多个非单词字符和一个空白字符。

于 2009-04-15T10:14:51.157 回答
0
Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

注意

next(String) 方法断言你只得到单词,因为原始的 useDelimiter() 方法错过了“|”

注意

您已使用正则表达式 "\r\n|\n" 作为行终止符。java.util.regex.Pattern 的 JavaDocs 显示了其他可能的行终止符,因此更完整的检查将使用表达式 "\r\n|[\r\n\u2028\u2029\u0085]"

于 2009-04-15T10:59:30.147 回答
0

这应该很简单:[^\\w-]\\W*|-\\W+

  • 但当然,如果它是散文,并且您想排除下划线
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • 或者如果您不期望数字:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

编辑:这些是更简单的形式。请记住完整的解决方案,它将处理行首和行尾的破折号将遵循此模式。(?:^|[^\\w-])\\W*|-(?:\\W+|$)

于 2009-04-15T16:11:53.700 回答