前言
今天碰到個需求,pm要求輸入框中取出非字母數字漢字的輸入.
帶著這個疑問開始今天的文章
準備工作
創建個demo 代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@interface viewcontroller () @property (weak, nonatomic) iboutlet uitextfield *input; @property (weak, nonatomic) iboutlet uilabel *label; @end @implementation viewcontroller - ( void )viewdidload { [super viewdidload]; self.input.delegate = self; [self.input addtarget:self action:@selector(textchange:) forcontrolevents:uicontroleventeditingchanged]; } //當文本內容改變時調用 - ( void )textchange:(uitextfield *)textfield { //這里調用相關方法過濾字符串顯示出來 self.label.text = //...; } |
在網上找了一圈大多都是使用謂詞去判斷時候包含,沒有幾個給出相應的處理字符串.
我找到了3種 處理字符串的方式
- 方案1 使用謂詞過濾
- 方案2 使用正則過濾增加尋找的字符串長度
- 方案3 使用正則精簡過濾字符串
方案1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
- (nsstring *)filterstring1:(nsstring *)str { nsstring *regex = @ "^[a-za-z0-9\u4e00-\u9fa5]+" ; nspredicate *pred = [nspredicate predicatewithformat:@ "self matches %@" , regex]; nsmutablestring * retstr = [nsmutablestring string]; for (nsinteger i=0; i< [str length];i++){ nsrange range = nsmakerange(i, 1); nsstring *character = [str substringwithrange:range]; if ([pred evaluatewithobject:character]) { [retstr appendstring:character]; } } return retstr; } |
這種方式雖然能實現 但是代碼略顯冗長,不過能就解決問題
1
2
3
4
5
6
7
|
//方案2 - (nsstring *)filterstring2:(nsstring *)str { nsstring *regex = @ "[^a-za-z0-9\u4e00-\u9fa5]" ; nsmutablestring *mstr = [nsmutablestring stringwithformat:@ "%@" , str]; nsuinteger i = [mstr replaceoccurrencesofstring:regex withstring:@ "" options:nsregularexpressionsearch range:nsmakerange(0, mstr.length)]; return [nsstring stringwithformat:@ "%@-長度:%zd" ,mstr,i]; } |
同樣的方法使用正則replaceoccurrencesofstring:withstring:options:range:方法替換字符串
下面我們精簡到2行代碼
1
2
3
4
5
|
//方案3 - (nsstring *)filterstring3:(nsstring *)str { nsstring *regex = @ "[^a-za-z0-9\u4e00-\u9fa5]" ; return [str stringbyreplacingoccurrencesofstring:regex withstring:@ "" options:nsregularexpressionsearch range:nsmakerange(0, str.length)]; } |
最終方案3 得到的預期結果還是不錯,推薦使用
總結
有些問題都是在工作中遇到,希望記錄下來一起分享和學習.
源碼下載:
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.sunyazhou.com/2018/06/25/20180625FilterString/