이 프로젝트는 관리자를 찾고 있습니다. 우선, 검토를 기다리는 몇 가지 풀 요청이 있습니다.
발을 딛고 싶다면 [email protected]으로 알려주세요!
TRE는 대략적인 (퍼지) 매칭과 같은 흥미로운 기능을 갖춘 가볍고 강력하며 효율적인 POSIX 호환 레지 렉스 매칭 라이브러리입니다.
TRE에 사용 된 일치하는 알고리즘은 검색중인 텍스트 길이에서 선형 최악의 시간을 사용하고 사용 된 정규 표현식의 길이에서 2 차 최악의 시간을 사용합니다.
다시 말해, 알고리즘의 시간 복잡성은 O (m^2n)이며, 여기서 m은 정규 표현의 길이이고 n은 텍스트의 길이입니다. 사용 된 공간은 또한 Regex 길이에서 2 차이지만 검색 된 문자열에 의존하지 않습니다. 이 2 차 거동은 실제로는 아마도 매우 드문 병리학 적 사례에서만 발생합니다.
이 코드를 사용하는 방법은 다음과 같습니다.
시스템에 설치된 다음 도구가 필요합니다.
먼저 나무를 준비하십시오. 소스 디렉토리의 루트로 변경하고 실행
./utils/autogen.sh
이것은 전제 조건 도구를 사용하여 다양한 것들을 재생시켜 건축 가능한 트리로 끝납니다.
그런 다음 구성 스크립트를 실행하고 평소와 같이 TRE를 빌드 할 수 있습니다.
./configure
make
make check
make install
준비된 나무 에서이 명령은 소스 코드 tarball을 만듭니다.
./configure && make dist
또는 실행할 수 있습니다
./utils/build-sources.sh
소스 코드 패키지를 구축하여 dist
하위 디렉토리에 넣습니다. 이 스크립트에는 작동하는 zip
명령이 필요합니다.
TRE는 또 다른 Regexp 경기자가 아닙니다. TRE에는 대부분의 무료 POSIX 호환 구현에없는 몇 가지 기능이 있습니다. 이러한 기능의 대부분은 해당 문제에 대해 무료 구현에 존재하지 않습니다.
대략적인 패턴 매칭을 사용하면 일치가 근사치가 될 수 있습니다. Tre는 정확한 일치를 얻기 위해 문자를 검색, 삭제 또는 검색 할 수있는 편집 측정 값 (Levenshtein 거리라고도 함)을 사용합니다.
각 삽입, 삭제 또는 대체는 일치의 거리 또는 비용을 추가합니다. TRE는 주어진 임계 값보다 비용이 저렴한 일치를보고 할 수 있습니다. TRE는 또한 최저 비용으로 일치하는 것을 검색하는 데 사용될 수 있습니다.
TRE에는 GREP 스타일의 대략적인 regexp 일치에 대한 동의 (대략 GREP) 명령 줄 도구가 포함되어 있습니다. TRE ANCHP는 다른 합의 구현과 달리 (아리조나 대학교의 UDI Manber와 같은), 삽입, 삭제 및 대체에 대한 모든 길이, 수많은 오류 및 불균일 한 비용의 전체 재 렉스를 허용합니다.
Posix는 Regexp 함수의 동작을 정확하게 정의합니다. TRE는 이러한 사양을 가능한 한 엄격하게 준수하려고 시도합니다. 예를 들어 TRE는 항상 서브 패턴에 대한 올바른 일치를 반환합니다. 다른 구현이이를 올바르게 수행하는 사람은 거의 없습니다. 사실, 내가 알고있는 TRE 외에 유일하게 다른 구현은 Tom Lord의 RX, John Maddock의 Regex ++, Glenn Fowler와 Doug McIlroy의 AT & T AST Regex입니다.
표준 TRE는 IEEE STD 1003.1-2001 또는 Open Group Base Specations Issue 6 (일반적으로 POSIX”라고하는 IEEE STD 1003.1-2001입니다. 관련 부분은 정규 표현식 (및 이론적 근거)의 기본 사양 및 regcomp()
API의 설명입니다.
Posix Regexp 매칭에 대한 훌륭한 설문 조사는 AT & T Labs Research의 Glenn Fowler의 TestRegex 페이지를 참조하십시오.
TRE에 사용되는 일치 알고리즘으로 인해 regexec()
호출에 의해 소비되는 최대 시간은 항상 검색 된 문자열의 길이에 직접 비례합니다. 한 가지 예외가 있습니다. 후면 참조가 사용되면 일치하는 데 시간이 걸릴 수 있습니다. 이는 참조를 일치시키는 것이 NP 완전한 문제이기 때문에 최악의 경우에 비해 지수 시간이 거의 필요하기 때문입니다.
regexec()
호출은 힙에서 메모리를 할당하지 않습니다. Tre는 regcomp()
호출 중에 필요한 모든 메모리와 regexec()
호출 기간 동안 스택 프레임의 임시 작업 공간을 할당합니다. 일치하는 동안 필요한 임시 공간의 양은 일정하며 검색 된 문자열에 의존하지 않습니다. 합리적인 크기의 REGEXP의 경우 regcomp()
호출 중에 50K 미만의 동적으로 할당 된 메모리, 컴파일 된 패턴 버퍼의 경우 20K 미만, regexec()
호출 동안 스택 프레임에서 2 킬로바이트 미만의 임시 작업 공간이 필요합니다. 시간 / 메모리 트레이드 오프가 없습니다. Tre는 코드 크기가 작습니다. TRE와 정적으로 연결하면 실행 가능 크기가 30k 미만으로 증가합니다 (GCC-3.2, X86, GNU/Linux).
Tre는 멀티 바이트 문자 세트를 지원합니다. 이것은 예를 들어 일본 지역과 같은 Regexps를 원활하게 사용할 수있게합니다. Tre는 또한 넓은 문자 API를 제공합니다.
TRE는 regexps 및 검색 문자열 모두에서 이진 제로 문자를 허용하는 API를 제공합니다. 예를 들어 이진 데이터에서 인쇄 가능한 단어를 검색하는 데 표준 API를 쉽게 사용할 수 없습니다 (일부 해킹은 가능하지만). 이진 제로가 포함 된 패턴을 검색하는 것은 표준 API에서 전혀 불가능합니다.
Tre는 완전히 실입니다. 내보낸 모든 함수는 재입국이며, 단일 컴파일 된 regexp 객체는 여러 컨텍스트에서 동시에 사용할 수 있습니다. 예를 들어 main()
및 신호 핸들러 또는 멀티 스레드 애플리케이션의 많은 스레드에서.
TRE는 여러 플랫폼에서 휴대 할 수 있습니다. 아래는 TRE를 개발하고 테스트하는 데 사용되는 플랫폼 및 컴파일 테이블입니다.
플랫폼 | 컴파일러 |
---|---|
freebsd 14.1 | Clang 18 |
우분투 22.04 | GCC 11 |
마코스 14.6 | 클랜 14 |
Windows 11 | Microsoft Visual Studio 2022 |
TRE는 대부분의 최신 POSIX와 같은 플랫폼에서 변경없이 컴파일해야하며 호스팅 된 C 구현을 통해 모든 플랫폼에 쉽게 휴대 할 수 있어야합니다.
플랫폼에 따라 Libutf8을 설치하여 넓은 문자 및 멀티 바이트 문자 세트 지원을 얻을 수 있습니다.
TRE는 NetBSD에 사용되는 "2 조항"BSD 스타일 라이센스와 본질적으로 동일한 라이센스에 따라 릴리스됩니다. 자세한 내용은 파일 라이센스를 참조하십시오.
현재 100% POSIX 준수에서 누락 된 요소 수집과 관련된 두 가지 기능이 있습니다. 이들은 다음과 같습니다.
수집 요소에 대한 지원 (예 [[.<X>.]]
, 여기서 <X>
는 Collating 요소입니다). POSIX는 문자 시퀀스가 다중 문자 수집 요소인지 여부를 결정하는 방법을 정의하지 않기 때문에 다중 문자를 통합하는 요소를 포용 적으로 지원할 수는 없습니다.
예를 들어 [[=<X>=]]
동등성 클래스에 대한 지원, 여기서 <X>
는 Collating 요소입니다. 동등성 클래스는 <X>
와 동일한 1 차 콜레이션 가중치를 갖는 모든 문자와 일치합니다. 다시, POSIX는 콜링 요소의 1 차 콜레이션 중량을 결정하기위한 휴대용 메커니즘을 제공하지 않습니다.
다른 휴대용 REGEXP 구현도 충전 요소를 지원하지 않습니다. 단일 예외는 Regex ++이며, 다른 로컬의 요소를 수집하기위한 자체 데이터베이스가 제공됩니다. 요소 및 동등성 클래스에 대한 지원은 널리 요청되지 않았으며 현재 ToDO 목록에서는 그다지 높지 않습니다.
이것들은 내가 곧 실제 구현을 계획하고있는 다른 기능들입니다.
[[:<:]]
및 [[:>:]]
와 같은 GNU Regex에서 누락 된 모든 GNU 확장 기능이 가능합니다.
가장 긴 경기 대신 가장 짧은 경기를 반환하기위한 REG_SHORTEST
regexec()
플래그.
펄 호환 구문 :
[:^class:]
클래스의 캐릭터를 제외한 모든 것과 일치합니다. [^[:class:]]
는 이미 작동하며 편의성 일뿐입니다.
A
문자열의 시작 부분에서만 일치합니다.
Z
문자열 끝에서 또는 끝에서 Newline 이전에만 일치합니다.
z
문자열 끝에서만 일치합니다.
l
다음 문자 (VI 생각).
u
대문자 다음 char (VI 생각).
L
소문자까지 E
(vi를 생각하십시오).
U
대문자는 E
(vi를 생각하십시오).
(?=pattern)
제로 폭의 긍정적 인 외관 어설 션.
(?!pattern)
제로 폭의 부정적인 외관 어설 션.
(?<=pattern)
제로 폭의 긍정적 인 외관 어설 션.
(?<!pattern)
제로 폭의 부정적인 외관 어설 션.
특히 대략적인 일치와 같은 TRE의 비표준 기능에 대한 문서는 사용할 확장을 찾으려면 include/tre/tre.h
“진행”을 느슨하게 정의하는 작업입니다. C 소스 코드가 편한 경우 몇 가지 추가 힌트를 제공 할 수 있습니다.