0

「Hej」という名前を「抽出」したいのですがNSString、このようなものがあります。"ALAssetsGroup - Name:Hej - ProgCam, Type:Album, Assets count:0"私はこのようにそれをやろうとしました:

NSString *sStr = [NSString stringWithFormat:@"%@", assetGroups[indexPath.row]];
NSRange range1 = [sStr rangeOfString:@"Name: "];
NSRange range2 = [sStr rangeOfString:@" - ProgCam"];
NSRange rRange = {range1.location + range1.length, range2.location};
NSString *rStr = [sStr substringWithRange:rRange];
cell.cellLabel.text = [NSString stringWithFormat:@"%@", rStr];

しかし、私はこのエラーが発生します:

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'-[__NSCFString substringWithRange:]: Range or index out of bounds'

ここで何が間違っていますか?

4

3 に答える 3

3

range2.location から range1.location + range1.length を減算する必要があります。

NSInteger start = range1.location + range1.length;
NSRange rRange = {start, range2.location - start};
于 2013-05-10T13:11:15.590 に答える
2

自分で計算することなく範囲を直接取得するための、正規表現 (別名 regex) に基づく代替手段:

// A regex pattern to match everything between "Name:" and " - ProgCam"
NSString *pattern = @"(?<=Name:).*?(?= - ProgCam)";

NSRange rRange = [sStr rangeOfString: pattern options: NSRegularExpressionSearch];

正規表現を分析するには:

(?<=XXX)

XXX から始めます (あなたの場合、これは "Name:" の部分です)。これは、XXX に一致する肯定的な後読みです。これは、XXX が存在する必要があることを意味しますが、一致した文字列の一部とは見なされません。

.*?

... 直接に何か (ドットで表される) が 0 回以上 (アスタリスク) 続きます。疑問符は、一致をできるだけ小さくする必要があることを意味します。この場合、文字列に 2 つの YYY (以下の例) がある場合、最初のものが選択されます。文字列にその問題がないため、実際には必要ありませんが、将来状況が変化した場合に備えて、パターンをより堅牢にします.

(?=YYY)

... YYY まで (あなたの場合、これは " - ProgCam" の部分です)。これはYYY に一致する肯定的な先読みです。これは、YYY が存在する必要があることを意味しますが、一致した文字列の一部とは見なされません。

パターンを独自の変数に保持する必要は特にありません。これは読みやすくするためです。ワンライナーを好む場合は、すべてを1行に貼り付けることができます.

ネット上には多くのチュートリアルがあります。たとえば、これです。

于 2013-05-10T15:53:30.693 に答える