在字符串中查找多个项目

时间:2017-12-18 18:50:49

标签: java string

我正在解析一堆员工事故报告,以便进行报告。

事件报告本身是自由文本,我必须按身体位置对伤害进行分类。我试图避免if{}elseif{}elseif{}....}else{}

事件报告示例:

Employee slipped on wet stairs and injured her knee and right arm, and struck her head on the handrail.

应将“膝盖”,“手臂”和“头部”添加到受影响区域。

Employee was lifting boxes without approved protective equipment resulting in a back strain.

应该向受影响的区域添加“返回”。

While attempting to unjam copier, employee got right index finger caught in machinery resulting in a 1-inch cut.

应该在受影响的区域添加“手指”。

现在,我有:

private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid){
   incident = incident.toUpperCase(); //eliminate case issues

   if(incident.contains("HEAD")){
       sid.addAffectedArea("HEAD");
   }else if(incident.contains("FACE")){
       sid.addAffectedArea("FACE");
   }else if(incident.contains("EYE")){
       sid.addAffectedArea("EYE");
   }else if(incident.contains("NOSE")){
       sid.addAffectedArea("NOSE");
   }
   //etc, etc, etc
   return sid;
}

if-elseif-ad inifinitum是否有更简单/更有效的方法来执行此操作?

4 个答案:

答案 0 :(得分:5)

一种方法是从各个身体部位构建正则表达式,使用它来搜索字符串,并将单个匹配项添加到列表中:

Pattern bodyParts = Pattern.compile("\\b(head|face|eye|nose)\\b", Pattern.CASE_INSENSITIVE);

在两端使用\b会阻止部分匹配,例如在"head"内的"forehead""eye"内找到"eyelid"

This Q&A explains how to search text using regex in Java.

答案 1 :(得分:2)

添加Set<String>作为参数,您可以在其中提供所有预期的关键字:

private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid,  Set<String> keywords){

   incident = incident.toUpperCase(); //eliminate case issues

   for (String keyword : keywords){        
     if(incident.contains(keyword)){
       sid.addAffectedArea(keyword);  
     }
   }

   return sid;
}

答案 2 :(得分:0)

也许创建一个包含所有部分{neck,shoulder,back等}的列表,然后检查该条目是否包含任何这些值?

答案 3 :(得分:0)

您可能能够创建某种容器(如列表或集合)以及所有不同的部分(IE头部,面部,眼部,鼻子,手指等),使用.split()分割字符串方法,然后将该字符串的每个部分与容器中的每个项目进行比较。

这可能更容易,但效率可能更低