web-dev-qa-db-ja.com

Objective-Cの文字列内の複数の文字を置き換えますか?

PHP私はこれを行うことができます:

$new = str_replace(array('/', ':', '.'), '', $new);

...文字/:のすべてのインスタンスを置換します。空白の文字列(削除するため)

これをObjective-Cで簡単に実行できますか?または、自分で転がす必要がありますか?

現在、私はstringByReplacingOccurrencesOfStringを複数回呼び出しています:

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""];

おかげで、
matt

48
Matt Sephton

これをやや非効率的な方法:

NSString *s = @"foo/bar:baz.foo";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => foobarbazfoo

NSScanner-[NSString rangeOfCharacterFromSet: ...]これをもう少し効率的に行いたい場合。

121
Nicholas Riley

あなたの方法が十分に良い状況があります私はマットだと思います..ところで

[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]];

のではなく

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];

nSMutableStringポインターをNSStringで上書きすると、メモリリークが発生する可能性があります。

27
N. R. Gresham

最近これをしなければならなかったし、効率的な方法を共有したかった:

(someTextがNSStringまたはテキスト属性であると仮定)

NSString* someText = @"1232342jfahadfskdasfkjvas12!";

(この例では、文字列から数字を取り除きます)

[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];

Obj-cエスケープ文字を使用して正規表現リテラル文字をエスケープする必要があることに注意してください。

(obj-cは二重バックスラッシュを使用して、特殊な正規表現リテラルをエスケープします)

...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]" 

これを興味深いものにしているのは、NSRegularExpressionSearchオプションはほとんど使用されていないが、いくつかの非常に強力なコントロールにつながる可能性があることです。

regex101.com で、素敵なiOS正規表現チュートリアルを見つけることができます here および正規表現に関する詳細

7
Tommie C.

基本的に上記のニコラスと同じものですが、文字セットを除くすべてを削除する場合(たとえば、セット "ABCabc123"にないすべてを削除する場合)、次の操作を実行できます。

NSString *s = @"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => ABC123abc

英数字のみが必要な場合に記号などを削除するのに役立ちます。

6
Stonz2
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str
{
    NSMutableString* string = [[NSMutableString alloc] initWithString:str];  // #&39; replace with '
    NSString* unicodeStr = nil;
    NSString* replaceStr = nil;
    int counter = -1;

    for(int i = 0; i < [string length]; ++i)
    {
        unichar char1 = [string characterAtIndex:i]; 
        for (int k = i + 1; k < [string length] - 1; ++k)
        {
            unichar char2 = [string characterAtIndex:k]; 

            if (char1 == '&'  && char2 == '#' ) 
            { 
                ++counter;
                unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39
                replaceStr = [string substringWithRange:NSMakeRange (i, 5)];  // #&39;
                [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]];
                break;
            }
        }
    }

    [string autorelease];

    if (counter > 1)
        return [self decodeHtmlUnicodeCharactersToString:string]; 
    else
        return string;
}
2
Krishna Gupta

削除したい文字が互いに隣接している場合、使用することができます

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)

それ以外は、同じ関数を数回使用するだけでもそれほど悪くないと思います。より一般的な方法で同じことをするための大きなメソッドを作成するよりもはるかに読みやすくなっています。

1
Gerard

文字列に拡張機能を作成...

extension String {

   func replacingOccurrences(of strings:[String], with replacement:String) -> String {
      var newString = self
      for string in strings {
          newString = newString.replacingOccurrences(of: string, with: replacement)
      }
      return newString
   }

}

次のように呼び出します。

aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"")
1
Matt Green

次に、replaceingOccurancesのregularExpressionオプションを使用したSwift 3の例を示します。

replacingOccurrencesString.CompareOptions.regularExpressionオプションとともに使用します。

例(Swift 3):

var x = "<Hello, [play^ground+]>"
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil)
print(y)

出力:

7Hello, 7play7ground777
1