Android开发必备技巧之高效字符串筛选

来自:网络
时间:2023-07-25
阅读:
目录

前言

开发了这么久,每次接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等,在开发中还是蛮重要的。

判断特殊字符

这里也是使用正则表达式来筛选的,下面列两种使用场景:

  • 字符串是否全是数字
  • 字符串是否为手机号码

代码如下:

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类里,如果想了解更多可以去查询一些相关资料或者自己再写一些,也希望掘友们也分享一下自己用到的,多多交流!

返回顶部
顶部