2016-08-04 9 views
1

Ich mag würde eine QRegExp wissen/haben, die alle ganzen Zahlen von einer Linie extrahieren könnte, aber das Extrahieren stoppen, wenn die Ziffer in einem Abschnitt Kommentar residiertNicht gierig Zustand Kommentare in einer Zeile zu ignorieren mit QRegExp

For Example 

    { 20,100,0X0},/*this line contains 2 integers*/ 

Meine

Code
QRegExp("(\\d+)\\}"); 

hat den Zweck erfüllt, aber nicht effizient, da die Kommentare können im Inneren der Blüte kommen

For Example, my Expression WILL NOT WORK IF 
{ 20,100/*new comment 2*/,0X0} 
Zahnspange

Also, wie ignoriere ich die Zeichenfolge im Kommentarbereich mit QRegExp und weiterhin meine Ausdruck

Antwort

0

Ich schlage vor, alle mehrzeiligen Kommentare als erste Alternative in einer Regex, und übereinstimmen und erfassen die Ziffernfolgen (d. Verwenden Sie die Erfassungsgruppe um [0-9]+ Muster):

QRegExp("/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/|\\b([0-9]+)\\b") 

Nun werden die Ziffern, die Sie benötigen in cap(1) sein.

Siehe regex demo

Es sieht auch wie Sie Wortgrenzen um das [0-9]+ Muster verwenden müssen eigenständige passen, „Ganzwort“ digit Brocken.

Muster Details:

+0

so, wenn ich zum Beispiel einige Makro im Code nur Texte extrahieren müssen würde ich QRegExp ("/ \\ * [^ *] * \\ * + (tun: [^/*] [^ * ] * \\ * +) */| \\ b ([A-Z _] +) \\ b ") –

+0

Der" Trick "wird hier erklärt - [* Der beste Regex-Trick aller Zeiten] (http: // www .rexegg.com/regex-best-trick.html # thetrick). Passen Sie an, was Sie überspringen und abgleichen * und erfassen Sie mit '(...)', was Sie brauchen. –

+0

Jetzt ist das Problem, wenn ich so etwas habe/****/* 2 Kommentar */die Ziffer wird extrahiert, aber es ist ein kommentierter Abschnitt immer noch nicht? –

0

Sie die Kommentar Abschnitte separat tun dies zuverlässig, es sei denn, die Regex-Engine unterstützt die vollständige Regex in negativen Lookbehind (die finden müssen - nach http://www.regular-expressions.info/ - nur das .NET und JGsoft Motoren tun).

Der erste Durchlauf entfernt oder überspringt die Kommentarabschnitte in Ihrer Zeichenfolge, dann machen Sie die Nummer, wie Sie möchten (z. B. wie jetzt).

Kommentare zu finden, können Sie dieses Muster verwenden:

/\*((?!\*/).)*\*/ 

Wenn Sie mit verschachtelten Kommentar Abschnitte befassen müssen, falls erforderlich, müssen Sie die Kommentare entfernen tun und wiederholen, bis keine weiteren Kommentar Abschnitte gefunden werden .

Wenn verschachtelte Kommentare keine Voraussetzung sind, können Sie die Kommentar- und Ziffernvergleichsregexte zu einem zusammenfassen und dann die übereinstimmenden Zeichenfolgen (oder Captures) prüfen, um herauszufinden, ob es sich um einen Kommentar oder eine Ziffernübereinstimmung handelt .

+0

Das '\/\ *. *? \ * \ /' Ist sehr ineffizient aufgrund des Lazy Dot Matching Patterns. Es wurde entrollt in [* Mastering Regular Expressions * Buch, * Unrolling-The-Loop-Komponenten für C-Kommentare * Abschnitt] (http://www.2.ii.uj.edu.pl/~tabor/prII09-10/perl/master .pdf), siehe Muster in meiner Antwort. Außerdem unterstützt QRegExp keine Lazer-Quantifizierer, und es besteht keine Notwendigkeit, den Schrägstrich '/' zu umgehen, da es kein spezielles Regex-Metazeichen ist. –

+0

@ WiktorStribiżew Nun, wie effizient es ist, hängt nur von der Motorimplementierung ab. Dies könnte mit einem DFA implementiert werden, der eine lineare Laufzeit hat. Davon abgesehen habe ich keine Ahnung von den Leistungsmerkmalen von QRegExp, aber ich habe gerade herausgefunden, dass es keine individuellen Lazer-Quantoren unterstützt, daher werde ich meine Antwort aktualisieren, um dies zu reflektieren. – Lucero

+0

Ja, es gibt mehrere Möglichkeiten, dieses Muster auszurollen. –