Swift의 문자열과 NSRange을 혼용하는 방법에 대해

NSRange는 NSString의 서브스트링의 영역을 표시하기 위해 정의된 구조체 타입이다.1 이는 문자열 내의 특정 범위를 가리키기 위해 부분 범위가 시작하는 위치와 그 범위의 크기를 정의한다. NSString — location : 시작 위치의 오프셋 — length : 범위의 길이

RegularExpression-swift

Swift3에서 문자열 확장과 재명명된 API를 이용하여 간결하게 문자열 내의 특정 범위를 찾고, 문자열을 치환하는 테크닉에 대해 살펴본다. Swift의 정규식 Swift는 언어 자체에서 정규식을 지원하지 않고 Foundation의 NSRegularExpression 클래스를 이용한다. NSRegulareExpression의 init은 throws이기 때문에 try와 같이 사용되어야 한다. 매치 결과는 TextCheckingResult 클래스의 인스턴스를 얻게 된다. 이는 매치영역 및 영역 내 각 매치 그룹의 범위를 NSRange값으로 가지고 있다. 문제는 Swift 문자열의 부분문자열은 Index<String.Index>에 의해서 얻을 수 있지, NSRange를 이용할 수 없다. 따라서 이를 컨버팅하는 편의함수나 타입 확장을 이용해야 한다.

Objective-C / Swift :: NSRegularExpression

NSRegularExpression Foundation은 유니코드 문자열에 대해서 정규식을 적용할 수 있는 NSRegularExpression 클래스를 제공한다. 이 클래스의 인스턴스는 컴파일된 정규식 패턴을 나타낸다. 여기서 사용되는 정규식 표현 패턴은 ICU의 안을 따르고 있다. (파이썬 정규식과 거의 유사하다.) http://userguide.icu-project.org/strings/regexp 기본적으로 정규식 객체는 자신의 패턴을 문자열에 적용해서 매치 결과들에 대해서 실행되는 블럭 이터레이터를 제공한다. 그 외에도 매치 결과를 배열로 리턴하거나, 매치의 수를 찾거나, 첫 매치를 찾는 등의 편의 메소드도 제공한다. 각각의 매치 결과는 NSTextCheckingResult 객체인데, 이는 전체 매치의 범위(NSRange) 및 개별 캡쳐 그룹의 범위값을 가지고 있다. 객체

regex conditional

정규식의 조건절 조건절은 정규식에서는 흔히 쓰이는 표현은 아니다. 게다가 모든 정규식 엔진이 이를 지원하는 것도 아니다. 조건절을 사용해야 하는 경우라면 대부분의 경우 프로그래밍 로직으로 이를 보완하는1 형태로 많이 쓰이고 있고, 정규식 자체의 조건절이 꼭 필요한 케이스가 널리 알려져 있지 않기도 하다.

정규식으로 짝수번째 숫자만 치환하기

코딩도장에서 흥미로운 문제를 하나 봤는데, 어떤 문자열에서 짝수번째로 등장한 숫자만 *로 치환하는 문제였다.문제의 출처가 정규식 관련 사이트인 것 같은데, 원본 주소는 링크가 깨진관계로… 예를 들자면 a1b2c3d4~e5f_6 과 같은 문자열이 있을 때 이중 숫자는 1, 2, 3, 4, 5, 6인데 그 중에서 짝수 번째로 등장하는 숫자만 *로 치환하는 것이다. 파이썬 구현은 매우 쉬운데…. def unvailEveryOtherDigits(str): s = [] occ = 0 for c in str: if c in “0123456789”: c += 1 if c % 2 == 0: s.append(‘*’) else: s.append(c)