/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.toolkit.util.regex; import java.util.Collection; import java.util.Collections; import com.alibaba.toolkit.util.collection.Predicate; import org.apache.oro.text.regex.MatchResult; import org.apache.oro.text.regex.PatternMatcher; import org.apache.oro.text.regex.PatternMatcherInput; import org.apache.oro.text.regex.Perl5Matcher; import org.apache.oro.text.regex.Perl5Substitution; import org.apache.oro.text.regex.Substitution; /** * 代表一个匹配的context. 一个context中保存了一次或多次匹配过程中可重复使用的对象, 以及最近一次匹配的结果. * * @author Michael Zhou * @version $Id: MatchContext.java,v 1.1 2003/07/03 07:26:34 baobao Exp $ */ public class MatchContext { private PatternMatcher matcher; private PatternMatcherInput input; private Substitution substitution; private MatchItem lastMatchItem; /** * 创建一个新的context. * * @param input 要匹配的字符串 */ public MatchContext(String input) { init(input); } /** * 创建一个新的context. * * @param input 要匹配的字符串 */ public void init(String input) { if (this.matcher == null) { this.matcher = createPatternMatcher(); } if (this.input == null) { this.input = new PatternMatcherInput(input); } else { this.input.setInput(input); } } /** * 取得用于匹配的patterns. * * @return 所有patterns */ public Collection getPatterns() { return Collections.EMPTY_LIST; } /** * 取得用于过滤匹配项的条件, 默认返回<code>null</code>. * * @return 过滤匹配项的条件 */ public Predicate getPredicate() { return null; } /** * 取得匹配的输入值. * * @return 匹配的输入值 */ public PatternMatcherInput getInput() { return input; } /** * 取得并复位匹配的输入值. 每次匹配动作完成后, 必须调用此方法才可进行第二次匹配. * * @return input 匹配的输入值 */ public PatternMatcherInput getInputReset() { input.setCurrentOffset(input.getBeginOffset()); return input; } /** * 取得pattern匹配器. * * @return pattern匹配器 */ public PatternMatcher getMatcher() { return matcher; } /** * 设置最近一次匹配的结果. * * @param item 最近一次匹配的结果 */ public void setLastMatchItem(MatchItem item) { this.lastMatchItem = item; } /** * 取得最近一次匹配的结果. * * @return 最近一次匹配的结果 */ public MatchItem getLastMatchItem() { return lastMatchItem; } /** * 取得替换对象. * * @param substitution 替换字符串 * @return 替换对象 */ public Substitution getSubstitution(String substitution) { this.substitution = createSubstitution(this.substitution, substitution); return this.substitution; } /** * 创建正则表达式的匹配器, 默认为<code>Perl5Matcher</code>, 子类可以改变这个实现. * * @return 正则表达式的匹配器 */ protected PatternMatcher createPatternMatcher() { return new Perl5Matcher(); } /** * 创建替换器, 默认为<code>Perl5Substitution</code>, 子类可以改变这个实现. * * @param reuse 可重用的替换器 * @param substitution 替换字符串 * @return 替换器 */ protected Substitution createSubstitution(Substitution reuse, String substitution) { if (reuse == null) { return new Perl5Substitution(substitution); } ((Perl5Substitution) reuse).setSubstitution(substitution); return reuse; } /** * 创建匹配结果, 默认为<code>MatchItem</code>, 子类可以改变这个实现. * * @param pattern 用于匹配的pattern * @param result 正则表达式的匹配结果 * @return 匹配结果项 */ protected MatchItem createMatchItem(MatchPattern pattern, MatchResult result) { return new MatchItem(this, pattern, result); } }