我正在尝试解析一组包含第一个希腊字母,然后是英文字母的单词。如果集合之间有分隔符,这将很容易。这就是我到目前为止所构建的。
- (void)loadWordFileToArray:(NSBundle *)bundle {
NSLog(@"loadWordFileToArray");
if (bundle != nil) {
NSString *path = [bundle pathForResource:@"alfa" ofType:@"txt"];
//pull the content from the file into memory
NSData* data = [NSData dataWithContentsOfFile:path];
//convert the bytes from the file into a string
NSString* string = [[NSString alloc] initWithBytes:[data bytes]
length:[data length]
encoding:NSUTF8StringEncoding];
//split the string around newline characters to create an array
NSString* delimiter = @"\n";
incomingWords = [string componentsSeparatedByString:delimiter];
NSLog(@"incomingWords count: %lu", (unsigned long)incomingWords.count);
}
}
-(void)parseWordArray{
NSLog(@"parseWordArray");
NSString *seperator = @" = ";
int i = 0;
for (i=0; i < incomingWords.count; i++) {
NSString *incomingString = [incomingWords objectAtIndex:i];
NSScanner *scanner = [NSScanner localizedScannerWithString: incomingString];
NSString *firstString;
NSString *secondString;
NSInteger scanPosition;
[scanner scanUpToString:seperator intoString:&firstString];
scanPosition = [scanner scanLocation];
secondString = [[scanner string] substringFromIndex:scanPosition+[seperator length]];
// NSLog(@"greek: %@", firstString);
// NSLog(@"english: %@", secondString);
[outgoingWords insertObject:[NSMutableArray arrayWithObjects:@"greek", firstString, @"english",secondString,@"category", @"", nil] atIndex:0];
[englishWords insertObject:[NSMutableArray arrayWithObjects:secondString,nil] atIndex:0];
}
}
但我不能指望有分隔符。
我看了at this question。我想要类似的东西。这将是:抓取字符串中的字符,直到找到英文字母。然后将第一个组转换为一个新字符串,将所有字符转换为第二个新字符串。
我只需要运行几次,因此优化不是我的最高优先级。任何帮助都将受到赞赏..
编辑:
我已经更改了我的代码,如下所示,以使用NSLinguisticTagger。这有效,但这是最好的方法吗?请注意,英文字符的解释是 - 由于某种原因“und”......
传入的字符串是:άγαλμα,τοhismage,只有最后6个字符是英文的。
int j = 0;
for (j=0; j<incomingString.length; j++) {
NSString *language = [tagger tagAtIndex:j scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
if ([language isEqual: @"und"]) {
NSLog(@"j is: %i", j);
int k = 0;
for (k=0; k<j; k++) {
NSRange range = NSMakeRange (0, k);
NSString *tempString = [incomingString substringWithRange:range ];
NSLog (@"tempString: %@", tempString);
}
return;
}
NSLog (@"Language: %@", language);
}
答案 0 :(得分:1)
好吧,你可以做的就是用NSLinguisticTagger
来找出单词(或字母)的语言,如果语言有变化,你知道在哪里分割字符串。您可以像这样使用NSLinguisticTagger:
NSArray *tagschemes = @[NSLinguisticTagSchemeLanguage];
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options: NSLinguisticTagPunctuation | NSLinguisticTaggerOmitWhitespace];
[tagger setString:@"This is my string in English."];
NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
//Loop through each index of the string's characters and check the language as above.
//If it has changed then you can assume the language has changed.
或者,您可以使用NSSpellChecker
&#39; requestCheckingOfString
来获取一系列字符中的主导语言:
NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";
[spellChecker requestCheckingOfString:spellCheckText
range:(NSRange){0, [spellCheckText length]}
types:NSTextCheckingTypeOrthography
options:nil
inSpellDocumentWithTag:0
completionHandler:^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {
NSLog(@"dominant language = %@", orthography.dominantLanguage);
}];
This answer包含有关如何检测NSString语言的信息。
答案 1 :(得分:1)
请允许我介绍我的两个好朋友。 NSCharacterSet和NSRegularExpression。 与他们一起,规范化。 (以Unicode术语表示)
首先,您应该在对字符集进行分析之前对字符串进行规范化。 您将需要查看选项,但是对所有组合表单进行标准化是我要去的方式。 这意味着重音字符是一个而不是两个或更多。 它简化了要比较的事物数量。
接下来,您可以轻松地从字符串(甚至从文件加载)构建自己的NSCharacterSet对象,以用于测试集合成员资格。
最后,正则表达式可以使用Unicode属性名称作为类或字符类别实现相同的功能。正则表达式可能更简洁但更具表现力。