使用扫描仪的分隔符功能“abc-def”

时间:2009-04-15 09:11:49

标签: java regex java.util.scanner text-formatting

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

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

简单地发生的问题是:包含“ - ”的单词将被分开并计为两个单词。所以只是逃避\ - 不是选择的解决方案。

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

谢谢;)

5 个答案:

答案 0 :(得分:1)

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

示例:

  

据我们所知,这种情况得到了改善,我们最值得信赖的盟友Vorgons继续举办诗歌大赛。即使使用他们的Mute-O-Matic设备,敌人也没有动力去干扰它。

所以,你需要的分隔符是任何数量的空格和/或标点符号(你已经用你所展示的正则表达式覆盖的),或者每边至少有一个空格包围的连字符。 “或”的正则表达式字符是“|”。许多正则表达式实现中有空格字符类(空格,制表符和换行符)的快捷方式:“\ s”。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

也许这就是你要找的东西:

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

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

答案 3 :(得分: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+)*"));
}

<强> NB

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

<强> NB

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

答案 4 :(得分:0)

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

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

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