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ā)中最常用到的基本類(lèi)型嘛,可為了處理它們我們總不能每次寫(xiě)到字符串都要重新去編一個(gè)新的方法來(lái)處理(如果簡(jiǎn)單的也不是不行)?
這時(shí)候我們就需要整理出一個(gè)工具類(lèi)用來(lái)專(zhuān)門(mén)存放我們的字符串篩選的工具方法,以后使用的時(shí)候我們直接拿著調(diào)用就行,更加方便快捷,所以下面我們就來(lái)介紹一些在開(kāi)發(fā)工作中常用到的字符串篩選方法,讓大家都能掌握高效的字符串篩選技巧。
正篇
其實(shí)處理字符串的方法五花八門(mén),但還有很多是通用的,所以我們整理出這些通用性質(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
類(lèi)型的函數(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)的字符串中分離我們想要的小字符串,比如分離以大寫(xiě)字母開(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è)分離好的以大寫(xiě)字母開(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編碼表示的,這被稱(chēng)為"代理對(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)又增加了之類(lèi)的,但確實(shí)是可以判斷大多數(shù)情況的,上面的代碼就是用來(lái)判斷字符串中是否含有表情符號(hào)。
結(jié)語(yǔ)
當(dāng)然,我們字符串的篩選還有更多的方法,這里不再多說(shuō),我將其中一些已經(jīng)放入了我的RegularUtil
類(lèi)里,如果想了解更多可以去查詢(xún)一些相關(guān)資料或者自己再寫(xiě)一些,也希望掘友們也分享一下自己用到的,多多交流!
到此這篇關(guān)于Android開(kāi)發(fā)必備技巧之高效字符串篩選的文章就介紹到這了,更多相關(guān)Android字符串篩選內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 中 ActivityLifecycleCallbacks的實(shí)例詳解
這篇文章主要介紹了Android 中 ActivityLifecycleCallbacks的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Android編程入門(mén)之HelloWorld項(xiàng)目目錄結(jié)構(gòu)分析
這篇文章主要介紹了Android編程入門(mén)之HelloWorld項(xiàng)目目錄結(jié)構(gòu)分析,較為詳細(xì)的分析了Android項(xiàng)目的目錄結(jié)構(gòu)與具體作用,需要的朋友可以參考下2015-12-12Android使用GestureOverlayView控件實(shí)現(xiàn)手勢(shì)識(shí)別
這篇文章主要為大家詳細(xì)介紹了Android使用GestureOverlayView控件實(shí)現(xiàn)手勢(shì)識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android 通過(guò)當(dāng)前經(jīng)緯度獲得城市的實(shí)例代碼
Android 通過(guò)當(dāng)前經(jīng)緯度獲得城市的實(shí)例代碼,需要的朋友可以參考一下2013-06-06Android Toolbar應(yīng)用欄使用方法簡(jiǎn)介
App中應(yīng)用欄是十分常見(jiàn)的,通常應(yīng)用欄會(huì)顯示當(dāng)前頁(yè)面的標(biāo)題,還有一些操作按鈕,例如返回、搜索、掃碼等。本文介紹如何通過(guò)Toolbar實(shí)現(xiàn)應(yīng)用欄2022-12-12Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門(mén)必看
這篇文章主要介紹了Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門(mén)必看篇,需要的朋友可以參考下2018-03-03Android實(shí)現(xiàn)打開(kāi)本地pdf文件的兩種方式
在現(xiàn)代應(yīng)用中,PDF格式因其跨平臺(tái)、穩(wěn)定性好、展示內(nèi)容一致等特點(diǎn),在Android平臺(tái)上,如何高效地打開(kāi)本地PDF文件,不僅關(guān)系到用戶(hù)體驗(yàn),也直接影響到應(yīng)用的功能豐富度,本文將給大家詳細(xì)介紹了Android打開(kāi)本地pdf文件的兩種方式,需要的朋友可以參考下2025-04-04Android開(kāi)發(fā)簡(jiǎn)易音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)簡(jiǎn)易音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12android實(shí)現(xiàn)簡(jiǎn)單左滑刪除控件
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)一個(gè)簡(jiǎn)單左滑刪除控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08