2017-10-17 13 views
1

NSString内の文字セットの前に特定の文字を追加したいとします。例えばNSString内の文字セットに特定の文字を追加するには

NSString *input = @"abc^ 123 # //> <";  
NSString *insertBefore = @"~"; 
NSCharacterSet *needBeInserted = [NSCharacterSet 
         characterSetWithCharactersInString:@"~#^/<>"]; 

期待される結果:inputに表示されますneedBeInsertedのいずれかの文字がinsertBeforeを追加します。

result = @"abc~^ 123 ~# ~/~/~> ~<"; 

これを行うにはエレガントな方法がありますか? stringByReplacingOccurrencesOfStringの複数の行を使用する代わりに?

+0

使用[ 'escapedPattern'](https://developer.apple.com/documentation/foundation/nsregularexpression/1408386-escapedpatternforstring?language=

Objective-C demo onlineを参照してください。 objc) –

+0

残念ながら、「<' , '>」のような文字は含まれていません。 – user2131907

+0

しかし、それらは正規表現の中で特別なものではなく、エスケープする必要はありません。あなたの正確な要件(あなたはエスケープする必要がありますか?)を質問で定義してください。 –

答えて

1

あなたはcharacter classにあなたの文字を入れて、正規表現ベースの代替使用することができます:

[~#^/<>] 

$0は、結果の文字列にマッチ全体のテキストを挿入し ~$0と交換します。 regex demoを参照してください。

NSError *error = nil; 
NSString *input = @"abc^ 123 # //> <"; 
NSString *pat = @"[~#^/<>]"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pat options:nil error:&error]; 
NSString *modifiedString = [regex stringByReplacingMatchesInString:input 
     options:0 
     range:NSMakeRange(0, [input length]) 
     withTemplate:@"~$0"]; 
NSLog(@"%@", modifiedString); 

結果:abc~^ 123 ~# ~/~/~> ~<

0

あなたは文字を検索し、それを交換する必要があります:Safariで書かれ

NSRange searchRange = NSMakeRange(0,[input length]); 
NSRange charRange; 
while((charRange = [input rangeOfCharactersFromSet:escapeSet options:NSBackwardSearch).length range:searchRange) 
{ 
    // It is allowed to have a 0-length range: Insertion 
    input = [input stringByReplacingCharactersInRange:NSMakeRange(charRange.location, 0) withString:@"\"]; 

    // Shorten the search range 
    searchRange = NSMakeRange(0, charRange.location); 
} 

を。エッジケースやタイプミスがないかテストしてください。

もう1つの方法は、(1文字の)文字列の配列を文字セットから外し、その出現をエスケープ文字との組み合わせで置き換えることです。私にとってもっと複雑で自然ではないようです。

関連する問題