2011-12-21 28 views
0

我分裂一個NSString這樣的:(過濾字符串是一個NSString)拆分的NSString成詞,然後重新加入到原來的形式

seperatorSet = [NSMutableCharacterSet whitespaceAndNewlineCharacterSet]; 
    [seperatorSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; 
NSMutableArray *words = [[filterString componentsSeparatedByCharactersInSet:seperatorSet] mutableCopy]; 

我希望把背單詞到過濾字符串與形式原始標點符號和間距。我想這樣做的原因是我想改變一些單詞並將它原樣重新組合。

回答

2

既然你消除原有的標點符號,沒有辦法回自動打開它。

的唯一方法是不使用componentsSeparatedByCharactersInSet

另一種解決方案可能是通過串和迭代,每個字符,檢查它是否屬於你的字符集。
如果是,焦炭添加到列表和串到另一個列表(你可以使用NSMutableArray類)。 這樣,例如,您知道第一個和第二個子字符串之間的標點符號字符是分隔符列表中的第一個字符。

+0

我該怎麼做?你會告訴我一些代碼嗎? – charleyh 2011-12-22 00:27:59

+0

我編輯了答案,添加了一個可能的算法。 – Saphrosit 2011-12-22 01:22:29

+0

真棒,謝謝! – charleyh 2011-12-22 02:57:42

2

你是如何確定哪些話需要更換?首先,也許使用-stringByReplacingOccurrencesOfString:withString:options:range:會更合適。

+0

我不能使用-stringByReplacingOccurrencesOfString:withString:選項:範圍:因爲我想,當在一個單獨的字不包括它只是過濾掉的話出現。例如,如果課程是我的一個詞,我不想用「經典」來代替它。 – charleyh 2011-12-21 22:58:56

+0

使用空間爲您帶來優勢。你可以尋找像「@」class「'這樣的字符串。此方法還允許在掃描字符串時使用某些選項。 – 2011-12-21 23:23:34

+0

好的,我看到了這個問題。正如@DavidDunham建議的,查看其他API。 「NSLinguisticTagger」在解析字符串時可能非常有幫助。 – 2011-12-22 01:00:49

2

可以使用數組類的pathArray componentsJoinedByString:方法歸隊的話:

NSString *orig = [words pathArray componentsJoinedByString:@" "]; 
+0

是的,但所有的單詞都會以空格連接,而不是原標點符號。 – charleyh 2011-12-21 23:09:23

1

我的猜測是,你可能沒有使用最好的API。如果你真的很擔心字,你應該使用基於字的API。我對這是否是NSDataDetector或別的東西有點朦朧。 (我相信NSRegularExpression可以應付字邊界以更聰明的方式)

0

如果您使用的是Mac OS X 10.7以上版本或iOS 4以上版本,您可以使用NSRegularExpression,替換詞的模式是:「\ b \ b「 - (附近沒有空格)\ b匹配單詞邊界。看方法replaceMatchesInString:options:range:withTemplate:stringByReplacingMatchesInString:options:range:withTemplate:

在10.6公關前面,如果你想使用正則表達式,你可以包裝regcomp/regexec基於C語言的功能,它們支持單詞邊界爲好。不過,您可能更願意使用其他答案中提到的其他Cocoa選項之一來執行此簡單情況。

3
NSString *myString = @"Foo Bar Blah B.."; 
NSArray *myWords = [myString componentsSeparatedByCharactersInSet: 
        [NSCharacterSet characterSetWithCharactersInString:@" "] 
        ]; 
NSString* string = [myWords componentsJoinedByString: @" "]; 
NSLog(@"%@",string); 
6

由字分裂更健壯的方式是使用字符串枚舉。空格不一定是分隔符,並非所有語言都會分隔空格(例如日語)。

NSString * string = @" \n word1! word2,%$?'/word3.word4 "; 

[string enumerateSubstringsInRange:NSMakeRange(0, string.length) 
          options:NSStringEnumerationByWords 
         usingBlock: 
^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    NSLog(@"Substring: '%@'", substring); 
}]; 

// Logs: 
// Substring: 'word1' 
// Substring: 'word2' 
// Substring: 'word3' 
// Substring: 'word4' 
+0

,但由於在autorelease方法中聲明完成,完成此塊後的值已消失,我必須爲保存值做些什麼,我喜歡使用塊外的值 – 2016-04-13 12:41:24

+0

@KishoreKumar - 將「substring」存儲在「NSMutableArray」中你在塊外創建。 – Robert 2016-04-13 12:43:29

+0

是兄弟我已經嘗試過,但我的價值觀當我嘗試使用它@羅伯特http://codepaste.net/7du7k6 – 2016-04-13 12:45:21

相關問題