从NSString获取子字符串,直到到达NSArray中的任何字母 - 目标C

时间:2014-08-13 06:43:25

标签: objective-c regex string nsstring

我正在尝试解析一组包含第一个希腊字母,然后是英文字母的单词。如果集合之间有分隔符,这将很容易。这就是我到目前为止所构建的。

    - (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);

        }

2 个答案:

答案 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属性名称作为类或字符类别实现相同的功能。正则表达式可能更简洁但更具表现力。