package com.qxueyou.scc.exercise.service.impl.parser; import java.util.regex.Matcher; import java.util.regex.Pattern; 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; import com.qxueyou.scc.exercise.service.impl.node.Option; public class OptionParser extends Parser { /** * ϰÌâÑ¡Ïî±àºÅģʽ[´øÀ¨ºÅ] */ //Pattern optNoWithBrackets = Pattern.compile("\\(?[ABCDEFabcdef]\\)?[¡¢.£®]"); /** * ϰÌâÑ¡Ïî word×Ô´øµÄ¸ñʽµÄ a.a¡¢a) ÕâÈýÖÖ½ÏΪÆÕ±é£¬Ä¿Ç°03¿ÉÒÔ½âÎö³É¹¦£¬07½âÎöʧ°Ü*[\t] */ Pattern optNoWithBrackets = Pattern.compile("\\(?[ABCDEFGHIJKLMNOabcdefghijklmno]\\)?[.£®¡¢]"); /** * ϰÌâÑ¡Ïî±àºÅģʽ */ Pattern optNo = Pattern.compile("[ABCDEFGHIJKLMNOabcdefghijklmno]"); @Override public ParseResult parse(Node node, String str) { return parse((Option)node,str); } /** * ½âÎö Item * @param item * @param str * @return */ private ParseResult parse(Option option, String str) { //ϰÌâÑ¡Ïî Matcher optNoWithBracketsMatch = optNoWithBrackets.matcher(str); //³¢ÊÔµ÷ÓÃÉϼ¶½âÎöÆ÷¼ÌÐø½âÎö if(!matchBegin(optNoWithBracketsMatch)){ return new ParseResult(false,ParseResult.STEP_PRE,null); } Matcher optNoMatch = null; int start = 0; Option preOpt = null; optNoWithBracketsMatch.reset(); while(optNoWithBracketsMatch.find()){ String noWithBrackets = optNoWithBracketsMatch.group(); optNoMatch = optNo.matcher(noWithBrackets); optNoMatch.find(); String no = optNoMatch.group(); Option opt = getOpt(no.toUpperCase(),(Item)option.getParent()); if(start!=optNoWithBracketsMatch.start() && preOpt!=null){ preOpt.setContent( beautyContent( str.substring(start, optNoWithBracketsMatch.start()) ) ); } preOpt = opt; start = optNoWithBracketsMatch.end(); // ÔÚ×ʼƥÅä³É¹¦¼´Ìø³öÑ­»· //break ; } preOpt.setContent(beautyContent(str.substring(start, str.length()))); return new ParseResult(true,ParseResult.STEP_CUR,null); } /** * È¥³ýÎı¾ÖжàÓà×Ö·û * @param content * @return */ private String beautyContent(String str){ String prefix = ".¡£~¡¢¡¢£®£®)"; String content = str; while(content.length()>0 && prefix.contains(content.substring(0, 1))){ content = content.substring(1); } return content; } /** * »ñÈ¡ÌâĿѡÏî * @param no * @param item * @return */ private Option getOpt(String no,Item item){ Option opt = item.getOption(no); if(opt==null){ opt = item.getOption(""); if(opt==null){ opt = new Option(); item.addNode(opt); opt.setNo(no); } } return opt; } }