Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何替换独立存在的字符而不是NSString中的其他字符?_Objective C_String_Nsstring_Replace_Character Replacement - Fatal编程技术网

Objective c 如何替换独立存在的字符而不是NSString中的其他字符?

Objective c 如何替换独立存在的字符而不是NSString中的其他字符?,objective-c,string,nsstring,replace,character-replacement,Objective C,String,Nsstring,Replace,Character Replacement,好吧,假设我有这个字符串: R RATS ARE FAR 我想用X替换独立的R,以便: X RATS ARE FAR 我尝试过用替换字符串的发生率来替换字符串,但这会将所有的R替换为X。实现这一点的一种方法是检查字母前后是否有空格,这意味着字母是独立的,然后再进行杀戮,但这种方法似乎太蹩脚了。此外,字符串是动态的,R的位置也是动态的 我在这里假设单词可以被任何非字母数字字符包围,对吗?(否则您只需将@“R”替换为“X”,加上前导/尾随出现的特殊情况) 一种方法是使用 (\b表示PCRE样式

好吧,假设我有这个字符串:

R RATS ARE FAR
我想用X替换独立的R,以便:

X RATS ARE FAR

我尝试过用替换字符串的发生率来替换字符串,但这会将所有的R替换为X。实现这一点的一种方法是检查字母前后是否有空格,这意味着字母是独立的,然后再进行杀戮,但这种方法似乎太蹩脚了。此外,字符串是动态的,R的位置也是动态的

我在这里假设单词可以被任何非字母数字字符包围,对吗?(否则您只需将@“R”替换为“X”,加上前导/尾随出现的特殊情况)


一种方法是使用

\b
表示PCRE样式正则表达式中的单词*b*边界)



还有(在链接文档中搜索
kCFStringTokenizerUnitWordBoundary
),这可能会有所帮助。

我在这里假设,单词可以被任何非字母数字字符包围,对吗?(否则您只需将@“R”替换为“X”,加上前导/尾随出现的特殊情况)


一种方法是使用

\b
表示PCRE样式正则表达式中的单词*b*边界)



还有(在链接文档中搜索
kCFStringTokenizerUnitWordBoundary
),这可能会有所帮助。

我会这样做:

NSString *statement = @"R RATS ARE FAR";
statement = [statement stringByReplacingOccurrencesOfString:@" R " withString:@" X "];
// now check if the string starts with R + space
if ([statement hasPrefix:@"R "])
    statement = [statement stringByReplacingOccurrencesOfString:@"R " withString:@"X " options:0 range:NSMakeRange(0,2)];
// now check the end
if ([statement hasSuffix:@" R"])
   statement = [statement stringByReplacingOccurrencesOfString:@" R" withString:@" X" options:0 range:NSMakeRange([statement length] - 2, 2)];

如果您计划大量替换此字符串,则应使用
NSMutableString

我会这样做:

NSString *statement = @"R RATS ARE FAR";
statement = [statement stringByReplacingOccurrencesOfString:@" R " withString:@" X "];
// now check if the string starts with R + space
if ([statement hasPrefix:@"R "])
    statement = [statement stringByReplacingOccurrencesOfString:@"R " withString:@"X " options:0 range:NSMakeRange(0,2)];
// now check the end
if ([statement hasSuffix:@" R"])
   statement = [statement stringByReplacingOccurrencesOfString:@" R" withString:@" X" options:0 range:NSMakeRange([statement length] - 2, 2)];

如果您计划在这个字符串中进行大量替换,那么应该使用
NSMutableString

RegexKitLite。其他任何人尝试做同样的事情,您只需添加“两个文件,RegexKitLite.h和RegexKitLite.m,并针对/usr/lib/libicucore.dylib ICU共享库进行链接。”另外,要替换的字符串应该是NSMutableString,在上面的示例中,我必须使用\\b而不是\b。这对我来说是个好办法。谢谢你,Regexident.RegexKitLite真是太棒了。其他任何人尝试做同样的事情,您只需添加“两个文件,RegexKitLite.h和RegexKitLite.m,并针对/usr/lib/libicucore.dylib ICU共享库进行链接。”另外,要替换的字符串应该是NSMutableString,在上面的示例中,我必须使用\\b而不是\b。这对我来说是个好办法。谢谢你,雷吉森特。这实际上也和我描述的差不多。但它有一个很大的缺陷:只有当单词序列是严格的空格分隔的单词序列时,它才起作用。一旦引入非字母数字/非空格字符,您的方法就会中断,例如:“FOO是R,BAR不是”。@Regexident,原始问题没有提到任何非字母字符。公平点。OP的示例字符串的语言相似性使我假设可能涉及其他字母,即使没有特别提及。无论如何,我还是更喜欢使用问题的抽象(这里是regex),而不是自己编写所有可能的边缘情况。与单一用途的一次性实现相比,抽象对于较小的格式更改更安全,因此具有更长的生命周期。你同意吗?我很好奇。抛开所有评论不谈,毫无疑问,你也为OP的问题提供了一个有效的解决方案我同意使用Regex是一个更好的解决方案。但是如果最初的问题是完整的范围,那么我喜欢我的解决方案,如果我不需要在我的项目中添加另一个库的话。这实际上也是我所描述的。但它有一个很大的缺陷:只有当单词序列是严格的空格分隔的单词序列时,它才起作用。一旦引入非字母数字/非空格字符,您的方法就会中断,例如:“FOO是R,BAR不是”。@Regexident,原始问题没有提到任何非字母字符。公平点。OP的示例字符串的语言相似性使我假设可能涉及其他字母,即使没有特别提及。无论如何,我还是更喜欢使用问题的抽象(这里是regex),而不是自己编写所有可能的边缘情况。与单一用途的一次性实现相比,抽象对于较小的格式更改更安全,因此具有更长的生命周期。你同意吗?我很好奇。抛开所有评论不谈,毫无疑问,你也为OP的问题提供了一个有效的解决方案我同意使用Regex是一个更好的解决方案。但是如果最初的问题是完整的范围,那么如果我不必向我的项目中添加另一个库,那么我喜欢我的解决方案。