我需要一个java lib,它会比较两个不同的文本和一些相似之处,并告诉我它们是否相关。
例如,我会比较其中一个
a)“COMP 150.00 MG X 20.00 UN”
b)“COMP 150.00 MG X 60.00 UN”
这一个
c)“150 mg comp.rec.x 20”
并且lib应该告诉我第一个对应而第二个不对,因为 a)和 c)都提到了“ 150毫克胶囊和包装带来20个单位“和 b)指的是60个单位包..
我的另一个想法是关于正则表达式,但我不太喜欢它们,所以这就是我要求你帮助的原因。
提前致谢。
答案 0 :(得分:0)
实现Comparable接口并覆盖CompareTo方法。 如果没有找到答案,请用其他例子解释问题。
答案 1 :(得分:0)
如果文本变体总是以相同的方式构建,则正则表达式可能是解决此问题的一种方法。基本上你会根据一组表达式检查每个文本,看看它们是否匹配。根据变体的不同,表达式可能很简单,也可能需要更复杂。
对于上面的情况,第一个表达式可能如下所示:
COMP 150.00 MG X 20.00 UN
- > (identifier) (capsule weight) X (num units)
由此可以得出以下表达式:
^COMP (\d+(?:\.\d+)?) MG X ([\d]+(?:\.\d+)?) UN$
(这假设空格的数量始终相等,并且始终使用MG
和UN
)。
第二个表达:
150 mg comp.rec.x 20
- > (capsule weight) comp.rec.x (num packages)
可以推导出以下表达式:
^(\d+(?:\.\d+)?) mg comp\.rec\.x (\d+(?:\.\d+)?)$
您会看到两个表达式都包含以下部分两次:([\d]+(?:\.\d+)?)
这些部分将数字捕获到一个组中,然后允许您将该文本解析为Double
。
以下是该子表达式的简短细分:
( ... )
是一个捕获组,即您可以直接访问与该组匹配的部分\d+
表示一个或多个数字\.
是文字点(?: ... )
是非捕获组,即您可以应用量词,但无法直接访问匹配的部分从以上部分中您可以得到以下信息:
(?:\.\d+)?
表示最多一个点,后跟至少一个数字。这将匹配.123
但不匹配.1.2.3
或1.
(\d+(?:\.\d+)?)
表示至少一个数字,可选地后跟一个点,后跟至少一个数字。这将匹配1.23
,12.3
或123
,但不匹配1.
,.2
或1.2.3
。如果您有这些表达式,请在文本上应用正确的表达式(如果您知道,否则先测试)并提取这两个组。然后比较这些组的值。
注意:不要忘记在Java字符串中必须转义反斜杠,因此\d
将被写为"\\d"
等。