【发布时间】:2011-01-18 05:46:57
【问题描述】:
InputString:士兵可能有瘀伤、伤口、痕迹、脱臼或其他伤害他的伤。
预期输出:
瘀伤
伤口
标记
错位
受伤
广义模式尝试:
".[\s]?(\w+?)"+ // 瘀伤。
"(?:(\s)?,(\s)?(\w+?))*"+ // 伤口标记位错
"[\s]?(?:or|and) 其他 (\w+)."; // 伤害
该模式应该能够匹配其他输入字符串,例如:一名士兵可能有瘀伤或其他伤害他的伤。
在尝试上面的广义模式时,输出是: 瘀伤 位错 受伤
“(?:(\s)?,(\s)?(\w+?))*”的捕获组有问题。捕获组又出现了一次..但它只返回“错位”。 “标记”和“错位”:被吞噬了。
您能否建议正确的模式应该是什么,错误在哪里? 这个问题最接近这个question,但那个解决方案没有帮助。
谢谢。
【问题讨论】:
-
是什么让
bruises、wounds、marks、dislocations和Injuries与其他词不同?前四个单词前后有一个逗号,但我看不出Injuries是如何融入图片的。 -
我正在尝试执行以下任务来实现模式以提取关系:NP {, NP} * {,} 其他 NP 瘀伤、伤口、脱臼或其他伤害...下位词(“瘀伤” ,"injuries"), hyponym("wound","injuries"), hyponym("dislocations", "injuries") 所以,我们可以看到“Injuries”配件是如何被满足的。
-
当捕获组用量词注释时 [ie: (foo)*] 那么你只会得到最后一个匹配。如果您想获得所有这些,那么您需要在捕获中进行量化,然后您将不得不手动解析出这些值。尽管我是 regex 的忠实拥护者,但出于各种原因,我认为它不适合在这里......即使你最终没有做 NLP。
-
谢谢@PSpeed:你是对的,这就是原因。虽然这是不合适的,但除了 java regex 之外没有其他选项。 (你有什么可以建议的吗?)““如果你想获得所有这些,那么你需要在捕获中进行量化”。应该如何修改以下正则表达式? (?:(\s)?,(\s)?(\w+?))*
-
好吧,在这种情况下,量词基本上涵盖了整个正则表达式,您不妨使用 Matcher.find() 来逐步完成每个匹配项。另外,我很好奇为什么你有空白的捕获组。如果您要做的只是找到一组以逗号分隔的单词,那么就像: \w+(?:\s*,\s*\w+)* 然后不要打扰捕获组,只需拆分整个匹配。
标签: java regex csv capturing-group