Objective-C Cocoa 애플리케이션의 정규 표현식
초기 인터넷 검색은 Objective-C Cocoa 애플리케이션에서 정규 표현식을 수행 할 수있는 기본 제공 방법이 없음을 나타냅니다.
네 가지 질문이 있습니다
정말 맞습니까?
농담 해?
그렇다면 추천 할만한 훌륭한 오픈 소스 라이브러리가 있습니까?
NSScanner 클래스를 사용하여 라이브러리를 가져 오지 않고 충분히 가까워지는 방법은 무엇입니까?
iOS 4.0부터 Apple은 NSRegularExpression 클래스를 제공합니다 . 또한 10.7부터 클래스는 OS X에서 사용할 수 있습니다 .
- 예, 코코아에서는 정규식 지원이 없습니다. 부울 일치에만 관심이있는 경우 ICU 정규식 구문을 지원 하는 NSPredicate 를 사용할 수 있습니다 . 그러나 일반적으로 하위 표현식의 일치 또는 위치에 관심이 있으며 NSPredicate를 사용하여 얻을 수 없습니다.
- 언급했듯이 정규식 POSIX 함수를 사용할 수 있습니다 . 그러나 그것들은 느리게 간주되며 정규 표현식 구문은 다른 솔루션 (ICU / pcre )에 비해 제한 됩니다.
- 많은 OSS 라이브러리가 있으며 CocoaDev는 광범위한 목록을 가지고 있습니다.
예를 들어 RegExKitLite 에는 라이브러리가 필요하지 않습니다. 프로젝트에 .m 및 .h를 추가하십시오.
(RegExKitLite에 대한 불만은 카테고리를 통해 NSString을 확장하지만 기능으로 간주 될 수 있다는 것입니다. 또한 OS와 함께 제공되는 비공개 ICU 라이브러리를 사용하며 Apple에서 권장하지 않습니다.)
RegexKit은 내가 찾은 최고입니다. 매우 코코아 : y. 여러 iPhone 앱에서 "Lite"버전을 사용하고 있습니다.
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보다 훨씬 가볍습니다 (물론 가능하지는 않지만).
NSRegularExpression
Mac OS X v10.7 및 IOS 4.0부터 사용할 수 있습니다.
이 주제를 검색하는 동안 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());
If you're only using this C++ just for this function, then you may find it suitable to call this file extra.mm (class name Extra) and put this static class method in, and then add other static class methods when the situation arrives where it just makes sense to do it in C++ because it's less hassle in some cases. (There are cases where ObjC does something with less lines of code, and some cases where C++ does it with less lines of code.)
P.S. Still yet another way with this is to use a .mm file but make an Objective C wrapper around the use of std::string and std::regex_replace() (or regex_match()).
참고URL : https://stackoverflow.com/questions/422138/regular-expressions-in-an-objective-c-cocoa-application
'Programming' 카테고리의 다른 글
반응 – 폼 요소 상태를 형제 / 부모 요소로 전달하는 올바른 방법? (0) | 2020.05.23 |
---|---|
C ++에서 "long", "long long", "long int"및 "long long int"의 차이점은 무엇입니까? (0) | 2020.05.23 |
자바 배열 반영 : isArray와 instanceof (0) | 2020.05.23 |
C # 사용자에게 폴더에 대한 쓰기 권한이 있는지 테스트 (0) | 2020.05.23 |
표시와 반대되는 것이 있습니까? (0) | 2020.05.23 |