stringutils.java.svn-base

来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 2,677 行 · 第 1/5 页

SVN-BASE
2,677
字号
/**
 * $Revision: $
 * $Date: $
 *
 * Copyright (C) 2006 Jive Software. All rights reserved.
 *
 * This software is published under the terms of the GNU Lesser Public License (LGPL),
 * a copy of which is included in this distribution.
 */

package org.jivesoftware.spark.util;


import javax.swing.KeyStroke;

import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.BreakIterator;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Utility class to peform common String manipulation algorithms.
 */

public class StringUtils {

    // Constants used by escapeHTMLTags

    private static final char[] QUOTE_ENCODE = """.toCharArray();

    private static final char[] AMP_ENCODE = "&".toCharArray();

    private static final char[] LT_ENCODE = "<".toCharArray();

    private static final char[] GT_ENCODE = ">".toCharArray();

    // patterns for the email address checks

    private static Pattern basicAddressPattern;

    private static Pattern validUserPattern;

    private static Pattern domainPattern;

    private static Pattern ipDomainPattern;

    private static Pattern tldPattern;

    // prepare the patterns

    static {

        // constants used in the parsing of email addresses

        String basicAddress = "^([\\w\\.-]+)@([\\w\\.-]+)$";

        String specialChars = "\\(\\)><@,;:\\\\\\\"\\.\\[\\]";

        String validChars = "[^ \f\n\r\t" + specialChars + "]";

        String atom = validChars + "+";

        String quotedUser = "(\"[^\"]+\")";

        String word = "(" + atom + "|" + quotedUser + ")";

        String validUser = "^" + word + "(\\." + word + ")*$";

        String domain = "^" + atom + "(\\." + atom + ")+$";

        String ipDomain = "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$";

        // from http://www.icann.org/tlds/

        String knownTLDs = "^\\.(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$";


        basicAddressPattern = Pattern.compile(basicAddress, Pattern.CASE_INSENSITIVE);

        validUserPattern = Pattern.compile(validUser, Pattern.CASE_INSENSITIVE);

        domainPattern = Pattern.compile(domain, Pattern.CASE_INSENSITIVE);

        ipDomainPattern = Pattern.compile(ipDomain, Pattern.CASE_INSENSITIVE);

        tldPattern = Pattern.compile(knownTLDs, Pattern.CASE_INSENSITIVE);

    }


    /**
     * Replaces all instances of oldString with newString in string.
     *
     * @param string    the String to search to perform replacements on
     * @param oldString the String that should be replaced by newString
     * @param newString the String that will replace all instances of oldString
     * @return a String will all instances of oldString replaced by newString
     */

    public static final String replace(String string, String oldString, String newString) {

        if (string == null) {

            return null;

        }

        // If the newString is null or zero length, just return the string since there's nothing

        // to replace.

        if (newString == null) {

            return string;

        }

        int i = 0;

        // Make sure that oldString appears at least once before doing any processing.

        if ((i = string.indexOf(oldString, i)) >= 0) {

            // Use char []'s, as they are more efficient to deal with.

            char [] string2 = string.toCharArray();

            char [] newString2 = newString.toCharArray();

            int oLength = oldString.length();

            StringBuffer buf = new StringBuffer(string2.length);

            buf.append(string2, 0, i).append(newString2);

            i += oLength;

            int j = i;

            // Replace all remaining instances of oldString with newString.

            while ((i = string.indexOf(oldString, i)) > 0) {

                buf.append(string2, j, i - j).append(newString2);

                i += oLength;

                j = i;

            }

            buf.append(string2, j, string2.length - j);

            return buf.toString();

        }

        return string;

    }


    /**
     * Replaces all instances of oldString with newString in line with the
     * <p/>
     * added feature that matches of newString in oldString ignore case.
     *
     * @param line      the String to search to perform replacements on
     * @param oldString the String that should be replaced by newString
     * @param newString the String that will replace all instances of oldString
     * @return a String will all instances of oldString replaced by newString
     */

    public static final String replaceIgnoreCase(String line, String oldString, String newString) {

        if (line == null) {

            return null;

        }

        String lcLine = line.toLowerCase();

        String lcOldString = oldString.toLowerCase();

        int i = 0;

        if ((i = lcLine.indexOf(lcOldString, i)) >= 0) {

            char [] line2 = line.toCharArray();

            char [] newString2 = newString.toCharArray();

            int oLength = oldString.length();

            StringBuffer buf = new StringBuffer(line2.length);

            buf.append(line2, 0, i).append(newString2);

            i += oLength;

            int j = i;

            while ((i = lcLine.indexOf(lcOldString, i)) > 0) {

                buf.append(line2, j, i - j).append(newString2);

                i += oLength;

                j = i;

            }

            buf.append(line2, j, line2.length - j);

            return buf.toString();

        }

        return line;

    }


    /**
     * Replaces all instances of oldString with newString in line with the
     * <p/>
     * added feature that matches of newString in oldString ignore case.
     * <p/>
     * The count paramater is set to the number of replaces performed.
     *
     * @param line      the String to search to perform replacements on
     * @param oldString the String that should be replaced by newString
     * @param newString the String that will replace all instances of oldString
     * @param count     a value that will be updated with the number of replaces
     *                  <p/>
     *                  performed.
     * @return a String will all instances of oldString replaced by newString
     */

    public static final String replaceIgnoreCase(String line, String oldString,

                                                 String newString, int [] count)

    {

        if (line == null) {

            return null;

        }

        String lcLine = line.toLowerCase();

        String lcOldString = oldString.toLowerCase();

        int i = 0;

        if ((i = lcLine.indexOf(lcOldString, i)) >= 0) {

            int counter = 1;

            char [] line2 = line.toCharArray();

            char [] newString2 = newString.toCharArray();

            int oLength = oldString.length();

            StringBuffer buf = new StringBuffer(line2.length);

            buf.append(line2, 0, i).append(newString2);

            i += oLength;

            int j = i;

            while ((i = lcLine.indexOf(lcOldString, i)) > 0) {

                counter++;

                buf.append(line2, j, i - j).append(newString2);

                i += oLength;

                j = i;

            }

            buf.append(line2, j, line2.length - j);

            count[0] = counter;

            return buf.toString();

        }

        return line;

    }


    /**
     * Replaces all instances of oldString with newString in line.
     * <p/>
     * The count Integer is updated with number of replaces.
     *
     * @param line      the String to search to perform replacements on
     * @param oldString the String that should be replaced by newString
     * @param newString the String that will replace all instances of oldString
     * @return a String will all instances of oldString replaced by newString
     */

    public static final String replace(String line, String oldString,

                                       String newString, int[] count)

    {

        if (line == null) {

            return null;

        }

        int i = 0;

        if ((i = line.indexOf(oldString, i)) >= 0) {

            int counter = 1;

            char [] line2 = line.toCharArray();

            char [] newString2 = newString.toCharArray();

            int oLength = oldString.length();

            StringBuffer buf = new StringBuffer(line2.length);

            buf.append(line2, 0, i).append(newString2);

            i += oLength;

            int j = i;

            while ((i = line.indexOf(oldString, i)) > 0) {

                counter++;

                buf.append(line2, j, i - j).append(newString2);

                i += oLength;

                j = i;

            }

            buf.append(line2, j, line2.length - j);

            count[0] = counter;

            return buf.toString();

        }

        return line;

    }


    /**
     * This method takes a string and strips out all tags except <br> tags while still leaving
     * <p/>
     * the tag body intact.
     *
     * @param in the text to be converted.
     * @return the input string with all tags removed.
     */

    public static final String stripTags(String in) {

        if (in == null) {

            return null;

        }


        return stripTags(in, false);

    }


    /**
     * This method takes a string and strips out all tags while still leaving
     * <p/>
     * the tag body intact.
     *
     * @param in the text to be converted.
     * @return the input string with all tags removed.
     */

    public static final String stripTags(String in, boolean stripBRTag) {

        if (in == null) {

            return null;

        }

        char ch;

        int i = 0;

        int last = 0;

        char[] input = in.toCharArray();

        int len = input.length;

        StringBuffer out = new StringBuffer((int)(len * 1.3));

        for (; i < len; i++) {

            ch = input[i];

            if (ch > '>') {

                continue;

            }

            else if (ch == '<') {

                if (!stripBRTag && i + 3 < len && input[i + 1] == 'b' && input[i + 2] == 'r' && input[i + 3] == '>') {

                    i += 3;

                    continue;

                }

                if (i > last) {

                    if (last > 0) {

                        out.append(" ");

                    }

                    out.append(input, last, i - last);

                }

                last = i + 1;

            }

            else if (ch == '>') {

                last = i + 1;

            }

        }

        if (last == 0) {

            return in;

        }

        if (i > last) {

            out.append(input, last, i - last);

        }

        return out.toString();

    }


    /**
     * This method takes a string which may contain HTML tags (ie, &lt;b&gt;,
     * <p/>
     * &lt;table&gt;, etc) and converts the '&lt'' and '&gt;' characters to
     * <p/>
     * their HTML escape sequences.
     *
     * @param in the text to be converted.
     * @return the input string with the characters '&lt;' and '&gt;' replaced
     *         <p/>
     *         with their HTML escape sequences.
     */

    public static final String escapeHTMLTags(String in) {

        if (in == null) {

            return null;

        }

        char ch;

        int i = 0;

        int last = 0;

        char[] input = in.toCharArray();

        int len = input.length;

        StringBuffer out = new StringBuffer((int)(len * 1.3));

        for (; i < len; i++) {

            ch = input[i];

            if (ch > '>') {

                continue;

            }
            else if (ch == '<') {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?