我目前正在尝试过滤包含用“ - ”分隔的单词的文本文件。我想算一算。
scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));
简单地发生的问题是:包含“ - ”的单词将被分开并计为两个单词。所以只是逃避\ - 不是选择的解决方案。
如何更改分隔符表达式,以便像“foo-bar”这样的单词将保留,但单独的“ - ”将被过滤掉并忽略?
谢谢;)
答案 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+|$)