-5

下面是我的字符串

NSString *myString = @"file_1_23.pdf";
                            ^ ^^

我要提取的是 1 和 23。

知道如何得到这个吗?

其他可能的字符串可以是

NSString *myString = @"file_12_2.pdf";
NSString *myString = @"file_123_8.pdf";

我相信我需要使用方法- (NSString *)substringWithRange:(NSRange)range;,但对如何获得 _ 的第二个索引感到困惑

字符串的格式是

file_anyNumber_anyNumber.fileExtension

注意:它有_两次,这让我抓狂。

4

5 回答 5

3

这会将字符串的组件分解为字符串数组。

NSString *myString = @"file_123_8.pdf";

NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"_."];
NSArray *components = [myString componentsSeparatedByCharactersInSet:delimiters];

现在components数组包含字符串对象@"file", @"123", @"8", @"pdf"

于 2013-05-21T13:18:00.920 回答
2
NSString *myString = @"file_123_8.pdf";

NSArray *subStrings = [myString componentsSeparatedByString:@"_"];

NSString *myFirstString = [subStrings objectAtIndex:1];

NSString *lastString = [subStrings objectAtIndex:2];

NSArray *subStrings = [myString componentsSeparatedByString:@"."];

NSString *mySecondString = [subStrings objectAtIndex:0];

NSLog(@"First String is : %@  ,Second String is : %@", myFirstString, mySecondString);

输出将是

First String is : 123  ,Second String is : 8
于 2013-05-21T13:19:54.407 回答
0

希望这会帮助你。

-(NSString*)stringBetweenString:(NSString*)start andString:(NSString)end {
    NSRange startRange = [self rangeOfString:start];
    if (startRange.location != NSNotFound) {
        NSRange targetRange;
        targetRange.location = startRange.location + startRange.length;
        targetRange.length = [self length] - targetRange.location;   
        NSRange endRange = [self rangeOfString:end options:0 range:targetRange];
        if (endRange.location != NSNotFound) {
           targetRange.length = endRange.location - targetRange.location;
           return [self substringWithRange:targetRange];
        }
    }
    return nil;
}
于 2013-05-21T13:10:07.960 回答
0

将类别添加到 NSString (NSString+Regex)

有实现方法

- (NSArray *)matches:(NSString *)pattern
{
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];

    NSArray *matches = [regex matchesInString:self options:0 range:NSMakeRange(0, self.length)];

    matches;
}

现在用你的任何方法

NSArray *matches = [myString matches:@"(\\d)"];

for (NSTextCheckingResult *match in matches) 
{
    NSString *singleMatch = [myString match.range];
    NSLog(@"%@",singleMath);
}

这是未经测试的,但应该可以工作。如果您不想创建类别,只需在其他位置添加该方法,添加一个字符串作为参数之一并用self该参数替换。

于 2013-05-21T13:28:07.120 回答
0

这里有几个很好的答案。

为了完整起见,一个基于 NSScanner 的解决方案,一个为此类任务明确制作的类(当然,并不是说其他​​解决方案无效)。

NSString *myString = @"file_1_23.pdf";
NSString *firstString;
NSString *secondString;

NSScanner *scanner = [NSScanner scannerWithString: myString];

NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];

[scanner scanUpToString: @"_" intoString: NULL];
[scanner scanString: @"_" intoString: NULL];      // Consume the underscore

// Now, read the the first number
[scanner scanUpToString: @"_" intoString: &firstString];

[scanner scanString: @"_" intoString: NULL];      // Consume this underscore, too

// Read the second number
[scanner scanUpToString: @"." intoString: &secondString];

还有其他方法可以扫描字符串,但这种方法会显式扫描_您提到的两个下划线字符 ( )。

于 2013-05-21T15:33:58.650 回答