[Objective-C] 文字列操作まとめ


色々とめんどくさいので文字列操作のメモ。

-----------------------------

## 正規表現を作る

利用するクラス。

* `NSRegularExpression`クラス
* `NSTextCheckingResult`クラス

```objc
NSError *error = nil;
NSString *str = @"some text";
NSString *pattern = @"[hoge|fuga]";

// パターンから正規表現を生成する
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];

// 正規表現を適用して結果を得る
NSTextCheckingResult *match = [regexp firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];

// 正規表現でマッチした部分を取り出す
NSLog(@"matches: %d", match.numberOfRanges); // マッチした数
NSLog(@"%@", [str substringWithRange:[match rangeAtIndex:0]]); // マッチした文字列全部
NSLog(@"%@", [str substringWithRange:[match rangeAtIndex:1]]); // 最初にマッチした部分
NSLog(@"%@", [str substringWithRange:[match rangeAtIndex:2]]); // 以降、マッチした分続く

// 正規表現でマッチした部分を置き換える
NSString *template = @"This is template. first match is $0";
NSString *result = [regexp stringByReplacingMatchesInString:str options:0 range:NSMakeRange(0, str.length) withTemplate:template];
```

-----------------------------

##NSStringによる文字列操作

###NSStringクラスのインスタンスメソッド

| Method | description |
|--------|-------------|
| `-(unsigned int)length` | 文字列の長さを取得 |
| `-(BOOL)isEqualToString:(NSString *)string` | 同じ文字列であるかを比較 |
| `-(NSString *)stringByAppendingString:(NSString *)string` | 文字列を結合 |
| `-(NSString *)substringToIndex:(unsigned)anIndex` | 文字列の切り出し |
| `-(NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set` | 文字列のトリム |
| `-(BOOL)hasPrefix:(NSString *)string` | 文字列の先頭比較 |
| `-(BOOL)hasSuffix:(NSString *)string` | 文字列の後方比較 |
| `-(NSRange)rangeOfString:(NSString *)aString` | 文字列の検索 |
| `-(int)intValue` | int型にキャスト |
| `-(float)floatValue` | float型にキャスト |
| `-(double)doubleValue` | double型にキャスト |
| `-(BOOL)boolValue` | BOOL型にキャスト |
| `-(NSArray *)componentsSeparatedByString:(NSString *)separator` | 文字列を分割する |
| `-(NSString *)stringByAppendingPathExtension:(NSString *)ext` | ファイルパスの末尾にファイルの拡張子を追加する |
| `-(NSString *)stringByAppendingPathComponent:(NSString *)aString` | ファイルパスの末尾にファイル名を追加する |
| `-(NSString *)pathExtension` | ファイルパスの拡張子を取得する |
| `-(NSString *)lastPathComponent` | ファイルパスからファイル名を取得する |
| `-(instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error` | ファイルから文字列を取得する |
| `-(instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error` | URLから文字列を取得する |
| `-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error` | 文字列をファイルに保存 |



###フォーマットを利用して、変数から文字列を生成

```objc
int i = 100;
NSString *str = [[NSString alloc] stringWithFormat:@"i = %d;", i];
```

NSLogでの出力と同じ。


###NSStringオブジェクト同士を結合

```objc
NSString *str1 = @"abc";
NSString *str2 = @"def";
NSString *str3 = [str1 stringByAppendingString:str2];
```


###NSStringオブジェクトにフォーマットした文字列を連結

```objc
int i = 256;
NSString *str1 = @"i = ";
NSString *str2 = [str1 stringByAppendingFormat:@"%dです", i];
```


###文字列を分割する

```objc
NSString *str = @"abc:def:ghi";
NSArray *arr = [str componentsSeparatedByString:@":"];
```


###NSStringオブジェクトの内容をファイルに保存

```objc
NSString *str = @"abc";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; //paths[0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];
[str writeToFile:dataPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
```

###インターネット上からNSStringオブジェクトを作る

```objc
NSURL *url = [NSURL URLWithString:@"http://example.com/sample.txt"];
NSString *str = [[NSString alloc] initWithCoontentsOfURL:url encoding:NSUTF8Encoding error:nil];
```

###ファイルの内容からNSStringオブジェクトを作る

```objc
NSString *str;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentDirectory stringByAppendingPathComponent:@"test.txt"];
str = [[NSString alloc] initWithContentsOfFile:dataPath encoding:NSUTF8Encoding error:nil];
```

###ファイルパスからファイル名だけ取り出す

```objc
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];
NSString *documentsDirectoryName = [documentsDirectory lastPathComponent];
NSString *fileName = [dataPath lastPathComponent];
```

###ファイルパスからファイルの拡張子を取り出す

```objc
NSArray *paths = NSSearchPathForDirectoriesDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];
NSString *ext = [dataPath pathExtention];
```

###ファイルパスの末尾にファイル名を追加する

```objc
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];
```

###ファイルパスの末尾にファイルの拡張子を追加する

```objc
if ([name pathExtention] isEqualToString:@""]) {
	fileName = [name stringByAppendingPathExtention:@"txt"];
}
else {
	fileName = name;
}
```