あなたの文字列形式は非常に明確に定義されています(あなたが言うように、あなたの名前の前には常に「/ name_」が続き、常に「_」が続きます)。したがって、名前(「john」)には下線。
したがって、この種の問題に完全に適した単純な正規表現を検討します。
NSString *regexPattern = @"^.*/name_(.*?)_.*$";
NSString *name = [dataString stringByReplacingOccurrencesOfString: regexPattern
withString: @"$1"
options: NSRegularExpressionSearch
range: NSMakeRange(0, dataString.length)];
正規表現に慣れていない方のために説明すると、次のようになります。
- 文字列の先頭 (「^」) から開始します。
- "/name_" が後に続くすべて (".*") を許可する
- 次のものをキャプチャします(括弧は「これをキャプチャする」を意味します)
- 括弧内は何でも構いませんが (".*")、できるだけ短くしてください ("*" の後の "?")。
- アンダースコアが続き、文字列の最後 (「$」) までそこにあるものをすべて許可する必要があります。
これは文字列全体に一致し、一致 (つまり、文字列全体) を "$1" で置き換える場合、最初の (そして唯一の) 括弧に含まれる部分文字列で一致を置き換えます。
結果: 名前のみを含む文字列が生成されます。文字列の形式が正しくない場合 (つまり、2 つのアンダースコアの間に名前がない場合)、何も変更されず、完全な元の文字列が返されます。
いずれかのアプローチを好むかどうかはコーディング スタイルの問題ですが、正規表現が好きな場合、このアプローチはクリーンで理解しやすく、保守も簡単です。
私が見ているように、これの脆弱性はデータ形式が原因であり、他の「ランダムな」データに依存するもののように疑わしく見えるため、その文字列を解析するために選択した方法に関係なく、防御テストを追加するようにしてくださいデータ形式を確認し、予期しない文字列がデータに入力され始めた場合に警告します。アンダースコア、正規表現、NSScanner
.