Objective-C 코코아 응용 프로그램의 정규식
초기 구글링은 Objective-C 코코아 응용 프로그램에서 정규식을 수행하는 기본 제공 방법이 없음을 나타냅니다.
네 가지 질문입니다.
그게 정말 사실이에요?
누구 놀리니?
네, 그럼 추천해주실 만한 오픈소스 도서관이 있나요?
NS 스캐너 클래스를 사용하여 라이브러리를 가져오지 않고도 충분히 가까워질 수 있는 방법은 무엇입니까?
iOS 4.0부터 Apple은 NS Regular Expression 클래스를 제공합니다.또한 10.7 기준으로 이 클래스는 OS X에서 사용할 수 있습니다.
- 네, 코코아에서는 정규식 지원이 없습니다.부울 일치에만 관심이 있는 경우 ICU 정규식 구문을 지원하는 NSCredicate를 사용할 수 있습니다.그러나 일반적으로 일치하는 위치나 하위 표현식의 위치에 관심이 있으며 NSPredicate로는 얻을 수 없습니다.
- 언급한 것처럼 정규식 POSIX 기능을 사용할 수 있습니다.그러나 속도가 느리고 정규식 구문은 다른 솔루션(ICU/pcre)에 비해 제한적입니다.
- 많은 OSS 라이브러리가 있으며, CocoaDev에는 광범위한 목록이 있습니다.
예를 들어 RegExKitLite에는 라이브러리가 필요하지 않으며 프로젝트에 .m과 .h만 추가하면 됩니다.
(RegExKitLite에 대한 불만은 NSString을 범주별로 확장한다는 것이지만 기능으로도 간주할 수 있습니다.또한 OS와 함께 제공되는 비공용 ICU 라이브러리를 사용하는데, 이는 Apple에서 권장하지 않습니다.)
RegexKit는 제가 찾은 것 중에 최고입니다.매우 코코아:y.저는 저희 아이폰 앱 중 몇 개에서 "Lite" 버전을 사용하고 있습니다.
POSIX 정규식 라이브러리(POSIX 호환 OS의 경우 Yay)를 사용할 수 있습니다.해라
man 3 regex
REGEX 및 JSON 구문 분석 문제를 해결하기 위해 사용하는 싸고 더러운 해킹 솔루션은 UI WebView 개체를 만들고 Javascript 함수를 주입하여 구문 분석을 수행하는 것입니다.그러면 javascript 함수는 내가 관심 있는 값(또는 값 목록)의 문자열을 반환합니다.실제로 특정 작업에 맞게 사용자 지정된 작은 라이브러리 함수 집합을 저장한 다음 필요에 따라 호출할 수 있습니다.
이 기술이 대량의 반복적인 구문 분석 요청으로 확장되는지는 모르겠지만, 빠른 트랜잭션 작업의 경우 이해하지 못할 수 있는 추가 외부 리소스나 코드에 의존하지 않고 작업을 수행합니다.
저는 PCRE를 사용하는 AGRegex 프레임워크를 좋아합니다. PCRE 구문에 익숙하다면 편리합니다.이 프레임워크의 가장 좋은 버전은 PCRE 6.7을 사용하도록 업그레이드된 Corpory IRC 클라이언트에 있는 것입니다.
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
RegExKit보다 훨씬 가볍습니다(물론 성능은 떨어지지만).
NSRegularExpression
는 Mac OS X v10.7 및 IOS 4.0 이후에 사용할 수 있습니다.
이 주제를 검색하는 동안 Ruby 1.9 및 PHP5 뒤에 있는 정규 표현 엔진인 Oniguruma를 사용하는 Cocoa Oniguruma를 발견했습니다.기존의 OregonKit(일본어로)와 비교하면 조금 더 새로운 것 같습니다.다른 바인딩과 비교하여 이러한 바인딩이 어떻게 쌓이는지 확실하지 못합니다.
조금 검색해보니 라이브러리: RegexOnNSString
다음과 같은 기능을 포함하는 오픈 소스 라이브러리:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
및 사용NSRegularExpression
클래스. 사용하기 쉽고 아무 걱정도 하지 않아도 됩니다.
주의하세요.NSRegularExpression
Datamid에서 언급한 대로 Mac OS X v10.7 및 IOS 4.0 이후에 사용할 수 있습니다.
난 쉽게 해요.나는 목표 C 프로젝트에 새 C++ 파일을 추가하고 이름을 .mm로 바꾼 다음 내부에 표준 C++ 클래스를 만듭니다.그런 다음 C++ 함수에 대해 "public:" 섹션에서 NSString을 사용하고 NSString(또는 NSArray, 원하는 경우)을 반환하는 정적 클래스 메소드를 만듭니다.그런 다음 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:: 문자열을 다시 NS 문자열로 변환할 수 있습니다.
NSString *sResponse2 = @(sResult.c_str());
이 C++을 이 기능에만 사용하는 경우, 이 파일을 extra.mm (클래스 이름 Extra)로 불러 이 정적 클래스 메소드를 넣은 다음 C++로 하는 것이 더 번거롭지 않기 때문에 상황이 발생하면 다른 정적 클래스 메소드를 추가하는 것이 적합할 수 있습니다.(ObjC가 코드 행 수가 적은 경우도 있고, C++가 코드 행 수가 적은 경우도 있습니다.)
추신. 이것의 또 다른 방법은 .mm 파일을 사용하지만 std::string 및 std::reggex_replace()(또는 regex_match())를 사용하여 목표 C 래퍼를 만드는 것입니다.
언급URL : https://stackoverflow.com/questions/422138/regular-expressions-in-an-objective-c-cocoa-application
'programing' 카테고리의 다른 글
커서를 대기 커서로 돌리게 하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
---|---|
jQuery 처음을 제외한 모든 테이블 행 삭제 (0) | 2023.05.29 |
MongoDB 데이터베이스 암호화 (0) | 2023.05.29 |
WPF에는 네이티브 파일 대화 상자가 있습니까? (0) | 2023.05.29 |
함수 및 함수 매개변수에 설명을 추가하는 방법은 무엇입니까? (0) | 2023.05.24 |