답변:
iOS 4.0부터 Apple은 NSRegularExpression 클래스를 제공합니다 . 또한 10.7부터 클래스는 OS X에서 사용할 수 있습니다 .
예를 들어 RegExKitLite 에는 라이브러리가 필요하지 않습니다. 프로젝트에 .m 및 .h를 추가하십시오.
(RegExKitLite에 대한 불만은 카테고리를 통해 NSString을 확장하지만 기능으로 간주 될 수 있다는 것입니다. 또한 OS와 함께 제공되는 비공개 ICU 라이브러리를 사용하며 Apple에서 권장하지 않습니다.)
[myString rangeOfString:@"regex_here" options:NSRegularExpressionSearch]
POSIX 정규식 라이브러리를 사용할 수 있습니다 (POSIX 호환 OS의 경우 예). 시험
man 3 regex
REGEX 및 JSON 파싱 문제를 해결하는 데 사용하는 저렴하고 더러운 해킹 솔루션은 UIWebView 객체를 만들고 파싱을 수행하기 위해 Javascript 함수를 주입하는 것입니다. 그런 다음 javascript 함수는 내가 관심있는 값 (또는 값 목록)의 문자열을 반환합니다. 실제로 특정 작업에 맞게 사용자 정의 된 작은 라이브러리 함수를 저장 한 다음 필요에 따라 호출 할 수 있습니다.
이 기술이 엄청난 양의 반복되는 구문 분석 요청으로 확장되는지는 모르겠지만 빠른 트랜잭션 작업을 위해 이해할 수없는 추가 외부 리소스 또는 코드에 의존하지 않고 작업을 수행합니다.
PCRE를 사용하는 AGRegex 프레임 워크가 마음에 들어 PCRE 구문에 익숙하다면 편리합니다. 이 프레임 워크의 최고 버전은 PCRE 6.7을 사용하도록 업그레이드 된 Colloquy IRC 클라이언트의 프레임 워크입니다.
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
RegExKit보다 훨씬 가볍습니다 (물론 가능하지는 않지만).
이 주제를 검색하는 동안 Ruby1.9 및 PHP5의 정규 표현식 엔진 인 Oniguruma 를 사용하는 CocoaOniguruma 를 발견했습니다. 기존의 OregKit (일본어)에 비해 조금 더 새로운 것 같습니다 . 이것들이 다른 바인딩과 어떻게 겹쳐 지는지 확실하지 않습니다.
인터넷 검색이 조금 쉬워 RegexOnNSString 라이브러리를 찾았 습니다.
다음과 같은 기능을 포함하는 오픈 소스 라이브러리 :
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
그리고 NSRegularExpression
수업을 사용 합니다. 사용하기 쉽고 아무것도 걱정할 필요가 없습니다.
, 유의하시기 바랍니다 NSRegularExpression
Datasmid가 언급 한 바와 같이, 맥 OS X의 v10.7 및 IOS 4.0부터 사용할 수 있습니다.
나는 그것을 쉽게 만든다. Objective C 프로젝트에 새 C ++ 파일을 추가하고 이름을 .mm로 바꾼 다음 표준 C ++ 클래스를 작성합니다. 그런 다음 NSString을 사용하고 NSString (또는 원하는 경우 NSArray)을 반환하는 C ++ 함수에 대해 "public :"섹션에서 정적 클래스 메서드를 만듭니다. 그런 다음 NSString을 C ++ std :: string으로 변환합니다.
// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
std::string sTemp([sInput UTF8String]);
s = sTemp;
}
거기에서 다음과 같이 regex_replace를 사용할 수 있습니다.
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
그런 다음 std :: string을 다음을 사용하여 NSString으로 다시 변환 할 수 있습니다.
NSString *sResponse2 = @(sResult.c_str());
이 함수에만이 C ++ 만 사용하는 경우이 파일 extra.mm (클래스 이름 Extra)을 호출 하고이 정적 클래스 메서드를 넣은 다음 상황이 발생할 때 다른 정적 클래스 메서드를 추가하는 것이 적합하다는 것을 알 수 있습니다 어떤 경우에는 덜 번거롭기 때문에 C ++에서하는 것이 합리적입니다. (ObjC가 적은 코드 줄로 무언가를하는 경우가 있고, C ++가 더 적은 코드 줄로 그것을하는 경우가 있습니다.)
추신 : 이것의 또 다른 방법은 .mm 파일을 사용하지만 std :: string 및 std :: regex_replace () (또는 regex_match ()) 사용 주위에 Objective C 래퍼를 만드는 것입니다.