Java Regex,使用逗号分隔值捕获组

时间:2010-02-18 08:47:54

标签: java regex csv capturing-group

InputString :士兵可能有瘀伤,伤痕,伤痕,脱臼或其他伤害他的伤害。

ExpectedOutput
瘀伤
伤口
标记
位错
损伤

广播模式尝试:  

       ".[\s]?(\w+?)"+                 // bruises.
      "(?:(\s)?,(\s)?(\w+?))*"+             // wounds marks dislocations
      "[\s]?(?:or|and) other (\w+).";     // Injuries

该模式应该能够匹配其他输入字符串,例如:士兵可能有伤痕或其他伤害他的伤害。

在尝试上面的通用模式时,输出为: 瘀伤 错位 伤

“(?:( \ s)?,(\ s)?(\ w +?))*”的捕获组有问题。捕获组还有一个出现..但它只返回“脱臼”。 “标记”和“错位:被吞噬。

请问你应该建议什么是正确的模式,错误在哪里? 这个问题最接近question,但该解决方案没有帮助。

感谢。

3 个答案:

答案 0 :(得分:0)

正则表达式不适合(自然)语言处理。使用正则表达式,您只能匹配定义良好的模式。你应该真的,真的放弃用正则表达式做这个的想法。

您可能想要开始一个新问题,您可以在其中指定用于执行此任务的编程语言,并在那里询问指针。

修改

PSpeed发布了一个有希望的链接到第三方库Gate,它可以执行许多语言处理任务。它是用Java编写的。我自己并没有使用它,但看着正在研究它的人/机构,看起来非常可靠。

答案 1 :(得分:0)

有效的模式是:\ w +(?:\ s *,\ s * \ w +)*然后手动分离CSV 使用Java Regex没有其他方法可以做到这一点。

理想情况下,Java正则表达式不适合NLP。一个有用的文本挖掘工具是:gate.ac.uk
感谢Bart K.和PSpeed。

答案 2 :(得分:0)

当捕获组使用量词[即:(foo)*]进行注释时,您将只获得最后一场比赛。如果你想获得所有这些,那么你需要在捕获内部量化,然后你必须手动解析值。作为我的正则表达者的忠实粉丝,我不认为这在任何原因上是合适的......即使你最终没有做NLP。

如何解决:(?:( \ s)?,(\ s)?(\ w +?))*

好吧,量词在这种情况下基本上涵盖了整个正则表达式,你也可以使用Matcher.find()来逐步完成每个匹配。另外,我很好奇为什么你有空白的捕获组。如果你要做的就是找到一个以逗号分隔的单词集,那就是:\ w +(?:\ s *,\ s * \ w +)*然后不要打扰捕获组,只是拆分整个匹配。

对于任何更复杂的问题:NLP,GATE是一个非常强大的工具。学习曲线有时很陡峭,但你有一整个科学行业的人可以借鉴:http://gate.ac.uk/