字符串的一些判断

原创 2015年11月18日 13:12:19
 * 判断为标点符号(去除乱码、字母、数字、中文的其他所有)
     * 
     * @param c
     *            字符
     * @return 是否为标点符号
     */
    public static boolean isPunctuation(char c) {
        return haveMessyCode(String.valueOf(c)) ? false : isChinese(c) ? false : isLetterOrDigit(c) ? false : true;
    }

    /**
     * 判断一个char是否为中文。
     * 
     * @param c
     *            字符
     * @return 是否为中文
     */
    public static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
            return true;
        }
        return false;
    }

    /**
     * 判断为数字或者字母
     * 
     * @param c
     *            字符
     * @return 是否为数字或者字母
     */
    public static boolean isLetterOrDigit(char c) {
        return Character.isLetterOrDigit(c);
    }

    /**
     * 判断字符串是否是乱码
     *
     * @param strName
     *            字符串
     * @return 是否是乱码
     */
    public static boolean haveMessyCode(String strName) {
        Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
        Matcher m = p.matcher(strName);
        String after = m.replaceAll("");
        String temp = after.replaceAll("\\p{P}", "");
        char[] ch = temp.trim().toCharArray();
        float chLength = ch.length;
        float count = 0;
        for (int i = 0; i < ch.length; i++) {
            char c = ch[i];
            if (!Character.isLetterOrDigit(c)) {
                if (!isChinese(c)) {
                    count = count + 1;
                }
            }
        }
        float result = count / chLength;
        if (result > 0.4) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * @param str
     *            原型字符串
     * @param repeat
     *            重复次数
     * @return 新建的字符串
     */
    public static String build(String str, int repeat) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < repeat; i++) {
            buf.append(str);
        }
        return buf.toString();
    }

    /**
     * 校验字符串
     * 
     * @param str
     * @return
     */
    public static boolean checkStr(String str) {
        boolean flag = true;
        int length = Strings.nullToEmpty(str).trim().length();
        for (int i = 0; i < length; i++) {
            char charAt = str.charAt(i);
            if (filterStr(charAt) == true) {
                continue;
            }
            if (checkType(charAt).toString().equals(CharType.OTHER.toString())) {
                flag = false;
                break;
            }
        }
        return flag;
    }

    public static boolean filterStr(char c) {
        String filter = "$ \n……    。`^><》《“”+=——~【】|";
        boolean flag = false;
        int length = filter.length();
        for (int i = 0; i < length; i++) {
            if (filter.charAt(i) == c) {
                flag = true;
            }
        }
        return flag;
    }

    enum CharType {
        DELIMITER, // 非字母截止字符,例如,.)( 等等 ( 包含U0000-U0080)
        NUM, // 2字节数字1234
        LETTER, // gb2312中的,例如:ABC,2字节字符同时包含 1字节能表示的 basic latin and latin-1
        OTHER, // 其他字符
        CHINESE; // 中文字
    }

    /**
     * 判断输入char类型变量的字符类型
     * 
     * @param c
     *            char类型变量
     * @return CharType 字符类型
     */
    private static CharType checkType(char c) {
        CharType ct = null;
        if (haveMessyCode(String.valueOf(c))) {
            ct = CharType.OTHER;
            return ct;
        }
        // 中文,编码区间0x4e00-0x9fbb
        if ((c >= 0x4e00) && (c <= 0x9fbb)) {
            ct = CharType.CHINESE;
            // Halfwidth and Fullwidth Forms, 编码区间0xff00-0xffef
        } else if ((c >= 0xff00) && (c <= 0xffef)) { // 2字节英文字
            if (((c >= 0xff21) && (c <= 0xff3a)) || ((c >= 0xff41) && (c <= 0xff5a))) {
                ct = CharType.LETTER;
                // 2字节数字
            } else if ((c >= 0xff10) && (c <= 0xff19)) {
                ct = CharType.NUM;
            } else {
                ct = CharType.DELIMITER;
            }
        } // basic latin,编码区间 0000-007f
        else if ((c >= 0x0021) && (c <= 0x007e)) { // 1字节数字
            if ((c >= 0x0030) && (c <= 0x0039)) {
                ct = CharType.NUM;
            } // 1字节字符
            else if (((c >= 0x0041) && (c <= 0x005a)) || ((c >= 0x0061) && (c <= 0x007a))) {
                ct = CharType.LETTER;
            } // 其他字符,可以认为是标点符号
            else {
                ct = CharType.DELIMITER;
            }
        } // latin-1,编码区间0080-00ff
        else if ((c >= 0x00a1) && (c <= 0x00ff)) {
            if ((c >= 0x00c0) && (c <= 0x00ff)) {
                ct = CharType.LETTER;
            } else
                ct = CharType.DELIMITER;
        } else {
            ct = CharType.OTHER;
        }
        return ct;
    }

    /**
     * 校验手机端字符串
     * 
     * @param str
     * @param length
     * @param jsonResult
     * @return
     */
    public static JsonResult checkStr(String str, int length, JsonResult jsonResult, String message) {
        jsonResult = new JsonResult(true);
        if (null != str) {
            if (!StringUtil.checkStr(str)) {
                jsonResult = new JsonResult(false, message + AppConstants.INPUT_RULE_MSG);
                return jsonResult;
            }
            if (str.length() > length) {
                jsonResult = new JsonResult(false, message + "最大长度不能超过" + length);
                return jsonResult;
            }
        }
        return jsonResult;
    }

    public static JsonResult checkStr(String str, int length, JsonResult jsonResult) {
        return checkStr(str, length, jsonResult, "");
    }

    /**
     * 校验手机端特殊字符进行base64转码
     * 
     * @param str
     * @return
     * @throws UnsupportedEncodingException
     * @throws Exception
     */
    public static JsonResult convertStr(String str, int length, JsonResult jsonResult) throws UnsupportedEncodingException, Exception {
        if (!Strings.isNullOrEmpty(str)) {
            if (str.length() > length) {
                jsonResult = new JsonResult(false, "最大长度不能超过" + length);
                return jsonResult;
            }
            str = Base64.encode(str, "utf-8");
        }
        jsonResult = new JsonResult(true);
        jsonResult.setData(str);
        return jsonResult;
    }

    /**
     * 字符串base64编码
     * 
     * @param str
     * @return
     * @throws Exception
     */
    public static String convertStrBase64Encode(String str) throws Exception {
        if (!Strings.isNullOrEmpty(str)) {
            str = Base64.encode(str, "utf-8");
        }
        return str;
    }

    /**
     * 校验手机端特殊字符进行base64解码
     * 
     * @param str
     * @return
     * @throws Exception
     */
    public static String convertStr(String str) throws Exception {
        if (!Strings.isNullOrEmpty(str)) {
            str = Base64.decode(str, "utf-8");
        }
        return str;
    }

    /**
     * 批量转换map中的value值base64解码
     * 
     * @param map
     * @param keys
     * @return
     * @throws Exception
     */
    public static Map<String, Object> convertMap(Map<String, Object> map, String... keys) throws Exception {
        for (String key : keys) {
            String value = String.valueOf(map.get(key));
            if (!Strings.isNullOrEmpty(value)) {
                map.put(key, convertStr(value));
            }
        }
        return map;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java判断字符串是否包含一些字符

在Java中判断字符串是否包含一些字符,在js中也会有同样的需求。下面是判断字符串包含字符的源码: package com.evantj.test; public class DateTEST {...
  • zl544434558
  • zl544434558
  • 2014年04月03日 18:27
  • 1634

【Web前端】Js利用正则表达式提取字符串

使用字符串replace函数(回调函数形式)配合正则表达式提取里面的股票代码// 使用正则表达式提取URL中的股票代码 var url = "http://hq.sinajs.cn/list=sh60...
  • zgljl2012
  • zgljl2012
  • 2016年01月22日 23:19
  • 1174

js字符操作以及正则表达式

stringObject.search(regexp) 下面介绍6个js函数: match() 找到一个或多个正则表达式的匹配。 replace() 替换与正则表达式匹配的子串。...
  • u010403387
  • u010403387
  • 2015年02月06日 18:58
  • 476

2016腾讯笔试题,删除字符串中的字符,使得剩下的字符串是回文串,如何删除使得回文串最长

此题是组合优化问题,求解过程是多步判断,从小到大求解每个子问题,最后求解的子问题就是原始问题,满足最优子结构性质,因此使用动态规划算法求解。求解过程中需要保存子问题的中间结果,以备用来求大问题的解。使...
  • u010638969
  • u010638969
  • 2016年07月28日 16:50
  • 1618

检测密码格式的合法性

一些网站设定了一些制定密码的规则。编写一个方法,检验一个字符串是否合法的密码。假设密码规则如下:      1.密码必须至少有8哥字符。      2.密码只能包括字母和数字。      3.密...
  • zhang5476499
  • zhang5476499
  • 2015年01月07日 15:36
  • 2665

C++之练习题23

1.给定两个由大小写字母和空格组成的字符串s1 和s2,它们的长度都不超过100 个字符、也可以长度为0。判断压缩掉空格、并忽略大小写后,这两个字符串在是否相等。...
  • fenger1943
  • fenger1943
  • 2014年07月28日 18:23
  • 587

POJ 百炼 保研机试 2976:All in All

2976:All in All 查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65536kB 描述给定两个字符串s和t,请判断s是否是t的子序列。...
  • u013240812
  • u013240812
  • 2015年10月31日 15:21
  • 847

数组和字符串常见操作

数组数组的检测:es3出来以后检测数组成为一个很经典的问题。对于一个网页或者一个全局的作用域而言,使用instanceof 就可以,但是如果有框架嵌套就会失去作用。es5新增方法: Array.isA...
  • baidu_33033415
  • baidu_33033415
  • 2017年03月17日 10:18
  • 135

ACM-子串(字符串处理)

问题描述         有一些由英文字符组成的大小写敏感的字符串。请写一个程序,找到一个最长的字符串 x,使得:对于已经给出的字符串中的任意一个 y, x 或者是 y 的子串、或者 x 中的字符反...
  • Wang_1997
  • Wang_1997
  • 2017年02月24日 12:00
  • 309

字符串的简单应用

百练字符串习题解答: 百练:2742,2942,2974,2975,2743,1936,2818,2819,2820,2804,2797,2799....
  • fzl1941572592
  • fzl1941572592
  • 2017年05月13日 00:56
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串的一些判断
举报原因:
原因补充:

(最多只允许输入30个字)