/* * Copyright 1999-2017 Alibaba Group. * * 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.json.test; /** * <pre> * 当有比较多的字符不能在某个串中出现, 通过一个查表算法确定。比如识别 * [a,b,c,d]不能在一个string中出现。 * 由于消耗比较多的内存, 最好使用单一实例。 初始化过程并非线程安全。 最 * 好一次完成初始化的过程。 * 使用方法: * DetectProhibitChar p2 = new DetectProhibitChar(); * p2.addProhibitChar("我们是中国人**#W¥%&*(¥% * &*AAAAAAAAAAAAAAAAAAAAAAA"); * for (int i = 0; i < 65536; i++) { * if (p2.isProhibitChar((char) i)) { * System.out.print((char) i); * } * } * </pre> * * @author sdh5724 */ public class DetectProhibitChar { byte[] masks = new byte[1024 * 8]; public DetectProhibitChar(){ } public DetectProhibitChar(char prohibits[]){ addProhibitChar(prohibits); } /** * 增加一个跳越字符 * * @param c */ public void addProhibitChar(char c) { int pos = c >> 3; masks[pos] = (byte) ((masks[pos] & 0xFF) | (1 << (c % 8))); } /** * 增加一个string里的所有字符 * * @param str */ public void addProhibitChar(String str) { if (str != null) { char cs[] = str.toCharArray(); for (char c : cs) { addProhibitChar(c); } } } public void addProhibitChar(char prohibits[]) { if (prohibits != null) { for (char c : prohibits) { addProhibitChar(c); } } } public void removeProhibitChar(char c) { int pos = c >> 3; masks[pos] = (byte) ((masks[pos] & 0xFF) & (~(1 << (c % 8)))); } public boolean isProhibitChar(char c) { int pos = c >> 3; int i = (masks[pos] & 0xFF) & (1 << (c % 8)); return (i != 0); } public boolean hasProhibitChar(char cs[]) { if (cs != null) { for (char c : cs) { if (isProhibitChar(c)) { return true; } } } return false; } public boolean hasProhibitChar(String str) { if (str != null) { return hasProhibitChar(str.toCharArray()); } return false; } }