Nice programing

NSString에서 영숫자가 아닌 문자 제거

nicepro 2020. 11. 6. 20:04
반응형

NSString에서 영숫자가 아닌 문자 제거


.NET Framework에서 영숫자가 아닌 문자를 제거하는 빠르고 쉬운 방법을 찾고 NSString있습니다. 아마도를 사용하는 NSCharacterSet것이지만 피곤하고 문자열에 영숫자 문자 만 포함하는 문자열을 반환하는 것은 없습니다.


분할 한 다음 결합하여이를 수행 할 수 있습니다. 구성 요소에 대해 OS X 10.5 이상이 필요합니다 .SeparatedByCharactersInSet :

NSCharacterSet *charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
NSString *strippedReplacement = [[someString componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""];

Swift에서는 componentsJoinedByString로 대체 join(...)되었으므로 여기서는 영숫자가 아닌 문자를 공백으로 대체합니다.

let charactersToRemove = NSCharacterSet.alphanumericCharacterSet().invertedSet
let strippedReplacement = " ".join(someString.componentsSeparatedByCharactersInSet(charactersToRemove))

Swift2의 경우 ...

var enteredByUser = field.text .. or whatever

let unsafeChars = NSCharacterSet.alphanumericCharacterSet().invertedSet

enteredByUser = enteredByUser
         .componentsSeparatedByCharactersInSet(unsafeChars)
         .joinWithSeparator("")

예를 들어 한 문자 만 삭제하려면 모든 반환 삭제 ...

 enteredByUser = enteredByUser
         .componentsSeparatedByString("\n")
         .joinWithSeparator("")

내가 한 일은 NSCharacterSet과 -invertedSet내가 찾은 메소드를 만드는 것이 었습니다 (문서 읽기 능력을 위해 여분의 수면 시간이 무엇을하는지 궁금합니다). 다음 someString은 영숫자가 아닌 문자를 제거하려는 문자열 이라고 가정하는 코드 스 니펫입니다 .

NSCharacterSet *charactersToRemove =
[[ NSCharacterSet alphanumericCharacterSet ] invertedSet ];

NSString *trimmedReplacement =
[ someString stringByTrimmingCharactersInSet:charactersToRemove ];

trimmedReplacement그러면 someString의 영숫자가 포함됩니다 .


수락 된 답변의 Swift 3 버전 :

let unsafeChars = CharacterSet.alphanumerics.inverted
let myStrippedString = myString.components(separatedBy: unsafeChars).joined(separator: "")

정리 카테고리

나는 메서드 호출을 stringByStrippingCharactersInSet:하고 stringByCollapsingWhitespace그건 그냥 드롭 인 것이 편리 할 수 있습니다.

@implementation NSString (Cleanup)

- (NSString *)clp_stringByStrippingCharactersInSet:(NSCharacterSet *)set
{
    return [[self componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
}

- (NSString *)clp_stringByCollapsingWhitespace
{
    NSArray *components = [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];

    return [components componentsJoinedByString:@" "];
}

@end

다음은 Cameron 카테고리 의 확장 기능인 Swift 버전입니다 .

extension String {

    func stringByStrippingCharactersInSet(set:NSCharacterSet) -> String
    {
        return (self.componentsSeparatedByCharactersInSet(set) as NSArray).componentsJoinedByString("")
    }

    func stringByCollapsingWhitespace() -> String
    {
        var components:NSArray = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        let predicate = NSPredicate(format: "self <> ''", argumentArray: nil)
        components = components.filteredArrayUsingPredicate(predicate)

        return components.componentsJoinedByString(" ")
    }
}

평범한 사이클은 내가 생각하는 실행 시간이 더 빠를 것입니다.

@implementation NSString(MyUtil)

- (NSString*) stripNonNumbers {
    NSMutableString* res = [NSMutableString new];
    //NSCharacterSet *numericSet = [NSCharacterSet decimalDigitCharacterSet];
    for ( int i=0; i < self.length; ++i ) {
        unichar c = [self characterAtIndex:i];
        if ( c >= '0' && c <= '9' ) // this looks cleaner, but a bit slower: [numericSet characterIsMember:c])
            [res appendFormat:@"%c", c];
    }
    return res;
}

@end

이것은 제공된 답변보다 더 효과적인 방법입니다.

+ (NSString *)alphanumericString:(NSString *)s {

    NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
    NSMutableString * ms = [NSMutableString stringWithCapacity:[s length]];
    for (NSInteger i = 0; i < s.length; ++i) {
        unichar c = [s characterAtIndex:i];
        if (![charactersToRemove characterIsMember:c]) {
            [ms appendFormat:@"%c", c];
        }
    }
    return ms;

}

또는 카테고리

@implementation NSString (Alphanumeric)

- (NSString *)alphanumericString {

    NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
    NSMutableString * ms = [NSMutableString stringWithCapacity:[self length]];
    for (NSInteger i = 0; i < self.length; ++i) {
        unichar c = [self characterAtIndex:i];
        if (![charactersToRemove characterIsMember:c]) {
            [ms appendFormat:@"%c", c];
        }
    }
    return ms;

}

@end

참고URL : https://stackoverflow.com/questions/1656410/strip-non-alphanumeric-characters-from-an-nsstring

반응형