2010-12-10 6 views
6

Ich denke darüber nach, einen regulären Ausdruck Parser in einer C-Bibliothek zu implementieren, die ich entwickle. Nun, die Frage ist: Gibt es irgendeinen Open-Source-Code, den ich wörtlich oder mit so wenig Änderungen wie möglich verwenden könnte? Meine Erwartungen den Code in Bezug sind:Empfehlungen für eine C-Implementierung eines Regex-Parsers

  • es in C geschrieben werden muss (nicht C++)
  • es muss unter gcc kompilieren, mingw, M $ VC
  • es muss nicht auf jedem dritten abhängen Party oder OS-spezifische Header/Libraries (dh alles, was benötigt wird, um es zu kompilieren muss mit einer Basisinstallation von gcc, mingw, M $ VC
  • leicht verfügbar sein, es wäre schön, wenn es Perl-kompatible Regex-Syntax (wie PCRE) in PHP)
  • Idealerweise sollte der Code so kompakt wie möglich sein

Gibt es fertige Lösungen, die Sie empfehlen können? Ich schaute auf PCRE für C und es sieht so aus, als hätte es alles, was in PHP verfügbar ist (welche Regeln), aber die Größe (1.4MB DL) ist ein wenig einschüchternd. Denkst du, dass es eine solide Wette ist? Oder gibt es andere denkbare Optionen?

[EDIT]

Die Bibliothek Ich bin der Entwicklung ist Open Source, Lizenz BSD.

+0

Mit welcher Lizenz werden Sie Ihre Bibliothek freigeben? – Cascabel

+0

PHP ist auf C gebaut. Ich wäre nicht überrascht, wenn PHP PCRE für C verwendet. –

+0

@Jefromi: Vielen Dank für die Frage, ich habe vergessen, diesen Teil der Info hinzuzufügen. Ich habe die Frage aktualisiert. – mingos

Antwort

2

PCRE ist so ziemlich der De-facto-Standard von Regex-Implementierungen (aus einem guten Grund). Mach dir keine Sorgen über die Größe, es ist groß, weil Regex-Implementierungen kompliziert sind. Benutze es trotzdem.

+3

Empfehlen schlechten Code, weil es "De-facto-Standard" ist und weil * foo * ist "kompliziert" (Hinweis: es ist nicht) ist kein guter Rat. –

+1

Ich empfehle es nicht, weil es kompliziert war. Ich habe festgestellt, dass PCRE "quasi der De-facto-Standard" ist. Ich glaube nicht, dass es schlechter Code ist. –

7

PCRE ist so groß, weil reguläre Ausdrücke hart sind. Und das meiste davon ist Dokumentation und Support-Code sowieso; Es ist viel kleiner, wenn es in Objektcode kompiliert wird.

+2

Reguläre Ausdrücke sind nicht schwer; PCRE ist gerade aufgebläht und zuletzt habe ich überprüft, dass es "O (2^n)" war.Eine vollständige POSIX-Regex-Implementierung sollte weniger als 10k wiegen (x86-Maschinencode); Ich bin mir nicht sicher, ob Perl-Regex (das ist nicht einmal eine normale Sprache) da es alle Arten von seltsamen Erweiterungen hat, aber ich bezweifle ernsthaft, es gibt einen legitimen Grund für PCRE, so groß wie es ist. –

+0

Der Grund, warum PCRE O (2^n) ist, ist, dass Perl-Regexes unterstützt werden (die Rückverweise unterstützen). Haben Sie eine Backtracking-Regex-Implementierung geschrieben? Wen sagen Sie, dass es nicht schwer ist oder wie groß es sein sollte? –

+1

Offensichtlich mit Rückverweisen ist es "O (2^n)", aber zuletzt habe ich überprüft, dass es auch sehr schlechtes asymptotisches Verhalten (vielleicht nur "O (n^2)" oder "O (nm)") für viele rein hat reguläre Ausdrücke, die keine Referenzen enthalten. –

3

Sie könnten TRE ausprobieren, wenn Sie mit der POSIX-Regex-Syntax zufrieden sind. Wenn Sie Perl-Syntax möchten, hat Google eine neue Implementierung, die es wert ist, ausgecheckt zu werden.

6

RE2, die Google regexp Implementierung hat eine Übereinstimmung in linearer Zeit (O(n) wenn n ist die Länge der Saite), PCRE und die meisten anderen regexp Motoren im schlimmsten Fall in exponentieller Zeit. Ein weiterer bemerkenswerter O(n) regexp Matcher ist flex, aber es braucht alle möglichen Regexps zur Kompilierzeit. Wenn Sie nach etwas kleiner als PCRE suchen, sehen Sie sich den Regexp-Matcher in busybox an, oder den Mustervergleicher in lua.

+0

Aber es ist C++ :(. Zu schlecht ... – mingos

+1

@Mingos, können Sie es nicht für den Verbrauch von C-Code wickeln, obwohl die Eingeweide in C++ geschrieben sind? Alle Compiler, die Sie nennen, machen C++ schließlich verfügbar. – RBerteig

+0

Not Die betreffende Bibliothek ist nicht meine Eigenschaft, ich bin nur ein Co-Maintainer. Die Richtlinie ist ziemlich streng: Der gesamte Code ist in C geschrieben, und dann wird noch ein C++ - Wrapper hinzugefügt. Ich bin nicht wirklich in die Macht, das zu beeinflussen. – mingos