/* * 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.text.MessageFormat; import org.apache.oro.text.regex.MalformedPatternException; import org.apache.oro.text.regex.Pattern; import org.apache.oro.text.regex.PatternCompiler; import org.apache.oro.text.regex.Perl5Compiler; /** * 将一种格式的pattern转换成Perl5标准的正则表达式的编译器. * * @author Michael Zhou * @version $Id: Perl5CompilerWrapper.java,v 1.1 2003/07/03 07:26:34 baobao Exp * $ */ public abstract class Perl5CompilerWrapper implements PatternCompiler { /** 默认的位标志 */ public static final int DEFAULT_MASK = 0; /** 大小写不敏感标志 */ public static final int CASE_INSENSITIVE_MASK = 0x1000; /** 返回只读的pattern标志 */ public static final int READ_ONLY_MASK = 0x2000; /** Escape字符 */ protected static final char ESCAPE_CHAR = '\\'; /** Perl5正则表达式的保留字符 */ private static final String PERL5_META_CHARS = "*?+[]()|^$.{}\\"; // 错误信息 private static final String ERROR_UNEXPECTED_CHAR = "Unexpected \"{0}\" near \"{1}\""; /** 内部的perl5编译器 */ protected final Perl5Compiler compiler = new Perl5Compiler(); /** * 将pattern编译成perl5正则表达式. * * @param pattern 要编译的pattern * @return Perl5正则表达式 * @throws MalformedPatternException 如果pattern格式不正确 */ public Pattern compile(String pattern) throws MalformedPatternException { return compile(pattern.toCharArray(), DEFAULT_MASK); } /** * 将pattern编译成perl5正则表达式. * * @param pattern 要编译的pattern * @param options 位标志 * @return Perl5正则表达式 * @throws MalformedPatternException 如果pattern格式不正确 */ public Pattern compile(String pattern, int options) throws MalformedPatternException { return compile(pattern.toCharArray(), options); } /** * 将pattern编译成perl5正则表达式. * * @param pattern 要编译的pattern * @return Perl5正则表达式 * @throws MalformedPatternException 如果pattern格式不正确 */ public Pattern compile(char[] pattern) throws MalformedPatternException { return compile(pattern, DEFAULT_MASK); } /** * 将pattern编译成perl5正则表达式. * * @param pattern 要编译的pattern * @param options 位标志 * @return Perl5正则表达式 * @throws MalformedPatternException 如果pattern格式不正确 */ public Pattern compile(char[] pattern, int options) throws MalformedPatternException { int perlOptions = 0; if ((options & CASE_INSENSITIVE_MASK) != 0) { perlOptions |= Perl5Compiler.CASE_INSENSITIVE_MASK; } if ((options & READ_ONLY_MASK) != 0) { perlOptions |= Perl5Compiler.READ_ONLY_MASK; } return compiler.compile(toPerl5Regex(pattern, options), perlOptions); } /** * 将pattern编译成perl5正则表达式字符串. * * @param pattern 要编译的pattern * @param options 位标志 * @return Perl5正则表达式 * @throws MalformedPatternException 如果pattern格式不正确 */ protected abstract String toPerl5Regex(char[] pattern, int options) throws MalformedPatternException; /** * 判断指定字符是否是perl5正则表达式保留的字符 * * @param ch 字符 * @return 如果是保留字符, 则返回<code>true</code> */ protected boolean isPerl5MetaChar(char ch) { return PERL5_META_CHARS.indexOf(ch) != -1; } /** * 取得错误信息. * * @param pattern 当前处理的pattern * @param index 当前处理的pattern的index * @return 错误信息 */ protected String getDefaultErrorMessage(char[] pattern, int index) { return MessageFormat.format(ERROR_UNEXPECTED_CHAR, new Object[] { new Character(pattern[index]), new String(pattern, 0, index) }); } }