我用一个正则表达式对我进行了一段时间的坚持:
但是如果它找到这样的字:“aaa-aa”(不是“aaa - aa”或“aaa - aaa-aa”),这个词不是分裂的,而是整个单词。
基本上,我希望每个单词分开一个句子,但也要考虑“aaa-aa”这个单词。我通过创建两个单独的函数来成功完成,一个用于分割\ w,另一个用于查找像“aaa-aa”这样的单词。最后,然后我添加两个,并将每个复合词减去。
例如,句子:
“你好我的名字是理查德”
首先我收集{Hello,my,name,is,Richard} 然后我收集{my-name} 然后我将{my-name}添加到{Hello,my,name,is,Richard} 然后我在这里取出{my}和{name} {Hello,my,name,is,Richard}。 结果:{你好,我的名字,是,理查德}
这种方法做我需要的,但是对于解析大文件,这变得太重了,因为对于每个句子,需要太多的副本。所以我的问题是,我能做些什么来将所有内容都包含在一个模式中?像:
“使用这种模式将文本分开”[\ W +],但是如果你找到像这样的单词“aaa-aa”,请将其视为单词,而不是两个单词。
答案 0 :(得分:0)
为什么不使用模式\\s+
?这完全符合你的要求,没有任何技巧:用空格分隔文字来分割文本。
答案 1 :(得分:0)
几乎与previous question中的正则表达式相同:
String sentence = "Hello my-name is Richard";
Pattern pattern = Pattern.compile("(?<!\\w)\\w+(-\\w+)?(?!\\w)");
Matcher matcher = pattern.matcher(sentence);
while (matcher.find()) {
System.out.println(matcher.group());
}
只需添加选项(...)?
以匹配未夸大的字词。
答案 2 :(得分:0)
你的描述不够清楚,但为什么不用空格分开呢?
答案 3 :(得分:0)
我不确定这种模式是否有效,因为我没有Java的开发工具,你可以尝试一下,它使用字符类减法,据我所知,只有Java正则表达式支持:< / p>
[\W&&[^-]]+
它表示匹配字符,如果它们是[\ W]和[^ - ],即字符是[\ W]而不是[ - ]。
答案 4 :(得分:0)
如果你想使用split()而不是显式匹配你感兴趣的单词,那么下面应该做你想要的:[\s-]{2,}|\s
为了解决这个问题,你首先要拆分两个或更多的空格, /或连字符 - 所以一个' - '将不匹配所以'一二'将被单独留下,但像'一 - 二','一 - 二'或甚至'一 - - - - 两个'将分为“一个”和“两个”。这仍然留下单个空格的“正常”情况 - “一二” - 无法匹配,因此我们添加一个或('|')后跟一个空格(\ s)。请注意,替代方案的顺序很重要 - 由“|”分隔的RE子表达式从左到右进行评估,因此我们需要首先放置空格和连字符。如果我们以相反的方式做到这一点,当呈现类似'one -two'之类的东西时,我们会匹配第一个空白并返回'one','-two'。
如果您想以交互方式使用Java RE,我可以完全推荐http://myregexp.com/signedJar.html,它允许您编辑RE并在编辑RE时看到它与样本字符串匹配。