package com.qxueyou.scc.exercise.service.impl.parser; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import com.qxueyou.scc.exercise.service.impl.Node; import com.qxueyou.scc.exercise.service.impl.ParseResult; import com.qxueyou.scc.exercise.service.impl.Parser; import com.qxueyou.scc.exercise.service.impl.node.Item; public class ItemAnswerParser extends Parser { /** * 参考答案[带括号] */ private static final String answerWithBracketsStr = "\\([ABCDEFGHIJKLMNOabcdefghijklmno√╳×TFtf]+\\)"; /** * 参考答案 */ private static final String answerStr = "[ABCDEFGHIJKLMNOabcdefghijklmno√╳×TFtf]+"; /** * 参考答案模式[带括号] */ private static final Pattern answerWithBrackets = Pattern.compile(answerWithBracketsStr); /** * 参考答案模式 */ private static final Pattern answer = Pattern.compile(answerStr); @Override public ParseResult parse(Node node, String str) { return parseAnswer((Item)node,str); } /** * 解析 Item 参考答案 * 1.解析出类似 *** ( ab ) 这样的参考答案 * 2.将类似参考答案 ( ab ) 替换成 ( ) * @param item * @param str * @return */ private ParseResult parseAnswer(Item item, String str) { //习题选项 Matcher answerBracketsMatch = answerWithBrackets.matcher(str); //返回 if(!answerBracketsMatch.find() || answerBracketsMatch.start()==0){ return new ParseResult(false,ParseResult.STEP_CUR,null); } Matcher answerMatch = null; answerBracketsMatch.reset(); if(answerBracketsMatch.find()){ String answerBrackets = answerBracketsMatch.group(); answerMatch = answer.matcher(answerBrackets); answerMatch.find(); String answer = answerMatch.group(); item.setAnswer(dealAnswer(answer.toUpperCase())); item.setTitle(item.getTitle().replaceAll(answerWithBracketsStr, "( )")); } //20150907修改:本来返回true,没有解析到一个类型,抛到上层 return new ParseResult(false,ParseResult.STEP_PRE,null); } /** * 处理answer * @param answer * @return */ private String dealAnswer(String answer){ if(StringUtils.equalsIgnoreCase("√",answer)||StringUtils.equalsIgnoreCase("√",answer)||StringUtils.equalsIgnoreCase("T",answer)){ return "True"; } if(StringUtils.equalsIgnoreCase("×",answer)||StringUtils.equalsIgnoreCase("╳",answer)||StringUtils.equalsIgnoreCase("F",answer)){ return "False"; } return answer; } }