您的字符串格式定义非常明确(如您所说,您所使用的名称始终以“/name_”开头,并始终以“_”开头),我认为名称(“john”)因此不能包含下划线。
因此,我会考虑一个简单的正则表达式,它非常适合这类问题:
NSString *regexPattern = @"^.*/name_(.*?)_.*$";
NSString *name = [dataString stringByReplacingOccurrencesOfString: regexPattern
withString: @"$1"
options: NSRegularExpressionSearch
range: NSMakeRange(0, dataString.length)];
如果您不熟悉正则表达式,这里发生的事情是:
- 从字符串的开头(“^”)开始
- 允许任何内容 (".*") 后跟 "/name_"
- 捕捉接下来的内容(括号的意思是“捕捉这个”)
- 在括号中,允许任何内容(“.*”),但尽可能短(“*”后面的“?”)
- 它后面必须跟一个下划线,然后允许出现在字符串末尾的任何内容(“$”)
这将匹配整个字符串,并且当用“$1”替换匹配项(即所有字符串)时,它将用第一个(也是唯一一个)括号中包含的子字符串替换匹配项。
结果:它将生成一个仅包含名称的字符串。如果字符串的格式不正确(即两个下划线之间没有名称),那么它不会更改任何内容并返回完整的原始字符串。
您是否更喜欢一种方法而不是另一种方法是编码风格的问题,但是如果您喜欢正则表达式,那么这种方法既干净又易于理解且易于维护。
正如我所看到的,其中的任何脆弱性都是由于数据格式造成的,它看起来可疑地像依赖于其他“随机”数据的东西,所以无论您选择哪种方法来解析该字符串,请确保您添加一些防御性测试检查数据格式并在意外字符串开始输入您的数据时提醒您。这可能是几年后,当你忘记了关于下划线、正则表达式和NSScanner
.