Java正则表达式,用于排除可变长度标记之间的单词(负面环视)

时间:2013-11-13 17:45:08

标签: java regex lookaround

我的目的是发现患者是否患有高血压。

这应该匹配:

  

患者患有糖尿病,高胆固醇和高血压。

     

患者对糖尿病,高胆固醇和高血压有阳性。

这不应该匹配:

  

患者没有糖尿病,高胆固醇或高血压。

     

众所周知,患者没有糖尿病,高胆固醇或高血压。

我可以用它来匹配两者:

patient[^\.]{0,}?hypertension

但是,这在http://gskinner.com/RegExr/上不起作用(仍然匹配):

patient[^\.]{0,}?(?!no)[^\.]{0,}?hypertension

那么,如何排除“患者”和“高血压”之间包含“否”的匹配?

请记住,任何数量的字符可能介于“患者”,“否”和“高血压”之间。

非常感谢!!!

P.S。:我知道否定发现可能比这更复杂,但是,对于我目前的努力,仅仅识别意味着否定的词语就足够了。

2 个答案:

答案 0 :(得分:0)

为人类语言编写防水正则表达式很困难,但我建议您使用的模式可以让您了解如何继续:

\bpatient\b(?>[^nhi.]++|\B[nhi]|n(?!o\b)|h(?!ypertension\b)|i(?!s\s+negative\s+for\b|sn't\s+known\s+to\s+have\b))+hypertension\b

然而,带有双重否定的句子会使模式失败:

示例:The patient isn't known to have diabetes, but hypertension.

答案 1 :(得分:0)

您可以使用前瞻来匹配一个而不是另一个:

(?=(patient.*hypertension))(?!(patient.*no.*hypertension))

和Rohit& Casimir提到,正则表达式不是正确的任务工具:你应该构建一个包含你可以选择的所有选项的解析器(例如Casimir所展示的“双重否定”),并且很可能你必须更新解析器偶尔会遇到你错过的其他可能性。