Android開(kāi)發(fā)必備技巧之高效字符串篩選
前言
開(kāi)發(fā)了這么久,每次接H5頁(yè)面對(duì)api請(qǐng)求時(shí)都會(huì)遇到一個(gè)常見(jiàn)的問(wèn)題,那就是對(duì)JSON字符串的處理和傳相關(guān)參數(shù)時(shí)候?qū)ψ址暮Y選處理,這些都是為了保證符合請(qǐng)求API的要求。
當(dāng)然,對(duì)字符串進(jìn)行處理遠(yuǎn)遠(yuǎn)不止這個(gè)地方需要,在開(kāi)發(fā)過(guò)程中或多或少都要使用一些方法去篩選符合我們要求的字符串,畢竟這是一個(gè)作為開(kāi)發(fā)中最常用到的基本類型嘛,可為了處理它們我們總不能每次寫到字符串都要重新去編一個(gè)新的方法來(lái)處理(如果簡(jiǎn)單的也不是不行)?
這時(shí)候我們就需要整理出一個(gè)工具類用來(lái)專門存放我們的字符串篩選的工具方法,以后使用的時(shí)候我們直接拿著調(diào)用就行,更加方便快捷,所以下面我們就來(lái)介紹一些在開(kāi)發(fā)工作中常用到的字符串篩選方法,讓大家都能掌握高效的字符串篩選技巧。
正篇
其實(shí)處理字符串的方法五花八門,但還有很多是通用的,所以我們整理出這些通用性質(zhì)的方法,以達(dá)到隨用隨取的目的。
這里先附上這個(gè)文件的地址(MyTest/app/src/main/java/com/example/mytest/RegularUtil.java at main · ObliviateOnline/MyTest · GitHub),有需要可以先看看,下面來(lái)介紹一下具體里面包含了哪些。
正則匹配判斷
public static boolean isMatch(String param, String pattern) {
return param != null && pattern != null && Pattern.compile(pattern).matcher(param).matches();
}isMatch()方法是一個(gè)返回值為boolean類型的函數(shù),首先我們對(duì)需要判斷的字符串以及正則模式判空,然后使用Pattern對(duì)象的compile()方法設(shè)置要匹配的正則表達(dá)式,后面再接著調(diào)用matcher()方法將要匹配的字符串輸入匹配,最后再使用 matches() 方法檢查字符串是否與該模式匹配。
這個(gè)方法是可以用來(lái)去驗(yàn)證密碼、郵箱地址、URL等,在開(kāi)發(fā)中還是蠻重要的。
判斷特殊字符
這里也是使用正則表達(dá)式來(lái)篩選的,下面列兩種使用場(chǎng)景:
- 字符串是否全是數(shù)字
- 字符串是否為手機(jī)號(hào)碼
代碼如下:
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去判斷的,和第一個(gè)方法沒(méi)有太多差別,不再贅述。
分割字符串
我們有時(shí)候還需要去在一串很長(zhǎng)的字符串中分離我們想要的小字符串,比如分離以大寫字母開(kāi)頭的單詞,下面代碼就是這個(gè)作用:
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;
}我們通過(guò)這個(gè)方法可以獲得一個(gè)分離好的以大寫字母開(kāi)頭的單詞數(shù)組,我們因?yàn)椴皇侨ヅ袛?,而是要獲取其中符合的單詞,所以使用了matcher.find()方法作為條件判斷檢索,再使用matcher.group()方法去拿到符合條件的單詞字符串,最后將他們統(tǒng)一放入我們的List數(shù)組里。
判斷是否含有表情包
現(xiàn)在很多輸入法自帶輸入表情符號(hào)的功能,所以在一些不能有這些表情包輸入的輸入欄中就需要這種方法:
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;
}這里我們做的就和之前的不一樣了,我們不再使用正則表達(dá)式匹配,而是根據(jù)下面這一資料來(lái)的: 在Java中,表情符號(hào)通常是由一對(duì)Unicode編碼表示的,這被稱為"代理對(duì)"(surrogate pair),其中高代理項(xiàng)(high surrogate)的范圍是0xd800到0xdbff,低代理項(xiàng)(low surrogate)的范圍是0xdc00到0xdfff。
我們根據(jù)這一點(diǎn),使用了一些特殊的Unicode字符編碼范圍來(lái)判斷字符串中是否包含表情符號(hào),當(dāng)然這估計(jì)也不夠全面,比如后面表情符號(hào)又增加了之類的,但確實(shí)是可以判斷大多數(shù)情況的,上面的代碼就是用來(lái)判斷字符串中是否含有表情符號(hào)。
結(jié)語(yǔ)
當(dāng)然,我們字符串的篩選還有更多的方法,這里不再多說(shuō),我將其中一些已經(jīng)放入了我的RegularUtil類里,如果想了解更多可以去查詢一些相關(guān)資料或者自己再寫一些,也希望掘友們也分享一下自己用到的,多多交流!
到此這篇關(guān)于Android開(kāi)發(fā)必備技巧之高效字符串篩選的文章就介紹到這了,更多相關(guān)Android字符串篩選內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Android Studio無(wú)法檢測(cè)新版本問(wèn)題解決
這篇文章主要介紹了詳解Android Studio無(wú)法檢測(cè)新版本問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android實(shí)戰(zhàn)打飛機(jī)游戲之無(wú)限循環(huán)的背景圖(2)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)打飛機(jī)游戲之無(wú)限循環(huán)的背景圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
點(diǎn)擊微信內(nèi)網(wǎng)頁(yè)a標(biāo)簽直接跳轉(zhuǎn)打開(kāi)淘寶APP的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于如何實(shí)現(xiàn)點(diǎn)擊微信內(nèi)網(wǎng)頁(yè)a標(biāo)簽直接跳轉(zhuǎn)打開(kāi)淘寶APP的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-11-11
解決android.support.v4.content.FileProvide找不到的問(wèn)題
這篇文章主要介紹了解決android.support.v4.content.FileProvide找不到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android實(shí)現(xiàn)手勢(shì)滑動(dòng)多點(diǎn)觸摸放大縮小圖片效果
這篇文章主要介紹了Android實(shí)現(xiàn)手勢(shì)滑動(dòng)多點(diǎn)觸摸放大縮小圖片效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Android ListView和Adapter數(shù)據(jù)適配器的簡(jiǎn)單介紹
這篇文章主要介紹了Android ListView和Adapter數(shù)據(jù)適配器的簡(jiǎn)單介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Android初學(xué)者必須知道的10個(gè)技術(shù)
本篇內(nèi)容給大家整理10個(gè)作為Android初學(xué)者必須要了解和會(huì)用的技術(shù)以及詳細(xì)代碼分析,需要的朋友收藏下慢慢學(xué)習(xí)吧。2017-12-12
Android啟動(dòng)初始化方案App StartUp的應(yīng)用詳解
這篇文章主要介紹了Android啟動(dòng)初始化方案App StartUp的使用方法,StartUp是為了App的啟動(dòng)提供的一套簡(jiǎn)單、高效的初始化方案,下面我們來(lái)詳細(xì)了解2022-09-09

