前语

开发了这么久,每次接H5页面临api请求时都会遇到一个常见的问题,那就是对JSON字符串的处理和传相关参数时分对字符串的挑选处理,这些都是为了确保契合请求API的要求。

当然,对字符串进行处理远远不止这个当地需求,在开发过程中或多或少都要运用一些办法去挑选契合咱们要求的字符串,毕竟这是一个作为开发中最常用到的基本类型嘛,可为了处理它们咱们总不能每次写到字符串都要重新去编一个新的办法来处理(假如简略的也不是不行)?

这时分咱们就需求整理出一个东西类用来专门存放咱们的字符串挑选的东西办法,今后运用的时分咱们直接拿着调用就行,愈加方便快捷,所以下面咱们就来介绍一些在开发工作中常用到的字符串挑选办法,让大家都能把握高效的字符串挑选技巧。

正篇

其实处理字符串的办法五花八门,但还有很多是通用的,所以咱们整理出这些通用性质的办法,以达到随用随取的意图。

这儿先附上这个文件的地址(MyTest/app/src/main/java/com/example/mytest/RegularUtil.java at main ObliviateOnline/MyTest GitHub),有需求能够先看看,下面来介绍一下详细里面包含了哪些。

正则匹配判别

public static boolean isMatch(String param, String pattern) {
    return param != null && pattern != null && Pattern.compile(pattern).matcher(param).matches();
}

isMatch()办法是一个返回值boolean类型的函数,首先咱们对需求判别的字符串以及正则形式判空,然后运用Pattern对象的compile()办法设置要匹配的正则表达式,后边再接着调用matcher()办法将要匹配的字符串输入匹配,最终再运用matches()办法查看字符串是否与该形式匹配。

这个办法是能够用来去验证暗码、邮箱地址、URL等,在开发中仍是蛮重要的。

判别特别字符

这儿也是运用正则表达式来挑选的,下面列两种运用场景:

  1. 字符串是否全是数字
  2. 字符串是否为手机号码

代码如下:

public static boolean isNumber(String param) {
    return param != null && Pattern.compile("[0-9]+").matcher(param).matches();
}
public static boolean isPhone(String param) {
    return param != null && Pattern.compile("^[1][0-9]{10}$").matcher(param).matches();
}

这儿仍是运用Pattern去判别的,和第一个办法没有太多差别,不再赘述。

切割字符串

咱们有时分还需求去在一串很长的字符串中别离咱们想要的小字符串,比如别离以大写字母最初的单词,下面代码就是这个效果:

public static List<String> splitWithUpcase(String param) {
    List<String> array = new ArrayList<>();
    if (param == null || param.isEmpty()) {
        return array;
    }
    Pattern pattern = Pattern.compile("[A-Z]{1}[a-z0-9]*");
    Matcher matcher = pattern.matcher(param);
    while (matcher.find()) {
        array.add(matcher.group());
    }
    return array;
}

咱们通过这个办法能够获得一个别离好的以大写字母最初的单词数组,咱们因为不是去判别,而是要获取其中契合的单词,所以运用了matcher.find()办法作为条件判别检索,再运用matcher.group()办法去拿到契合条件的单词字符串,最终将他们统一放入咱们的List数组里。

判别是否含有表情包

现在很多输入法自带输入表情符号的功用,所以在一些不能有这些表情包输入的输入栏中就需求这种办法:

public static boolean isContainEmoji(String account) {
    int len = account.length();
    boolean isEmoji = false;
    for (int i = 0; i < len; i++) {
        char hs = account.charAt(i);
        if (0xd800 <= hs && hs <= 0xdbff) {
            if (account.length() > 1) {
                char ls = account.charAt(i+1);
                int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                if (0x1d000 <= uc && uc <= 0x1f77f) {
                    return true;
                }
            }
        } else {
            // non surrogate
            if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
                return true;
            } else if (0x2B05 <= hs && hs <= 0x2b07) {
                return true;
            } else if (0x2934 <= hs && hs <= 0x2935) {
                return true;
            } else if (0x3297 <= hs && hs <= 0x3299) {
                return true;
            } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50|| hs == 0x231a ) {
                return true;
            }
            if (!isEmoji && account.length() > 1 && i < account.length() -1) {
                char ls = account.charAt(i+1);
                if (ls == 0x20e3) {
                    return true;
                }
            }
        }
    }
    return  isEmoji;
}

这儿咱们做的就和之前的不一样了,咱们不再运用正则表达式匹配,而是依据下面这一材料来的:
Java中,表情符号通常是由一对Unicode编码表示的,这被称为”署理对”(surrogate pair),其中高署理项(high surrogate)的规模是0xd800到0xdbff,低署理项(low surrogate)的规模是0xdc00到0xdfff。
咱们依据这一点,运用了一些特别的Unicode字符编码规模来判别字符串中是否包含表情符号,当然这估量也不行全面,比如后边表情符号又增加了之类的,但确实是能够判别大多数状况的,上面的代码就是用来判别字符串中是否含有表情符号。

结语

当然,咱们字符串的挑选还有更多的办法,这儿不再多说,我将其中一些已经放入了我的RegularUtil类里,假如想了解更多能够去查询一些相关材料或者自己再写一些,也希望掘友们也分享一下自己用到的,多多交流!