Regex zum Ersetzen von Boolean durch bool

8

Ich arbeite an einer C ++ - Code-Basis, die vor kurzem von X / Motif nach Qt verschoben wurde. Ich versuche, ein Perl-Skript zu schreiben, das alle Vorkommen von Boolean (von X) durch Bool ersetzt. Das Skript macht nur einen einfachen Ersatz.

%Vor%

Es gibt ein paar Bedingungen.

1) Wir haben CORBA in unserem Code und \ b entspricht CORBA :: Boolean, was nicht geändert werden sollte.
2) Es sollte nicht übereinstimmen, wenn es als eine Zeichenfolge gefunden wurde (d. H. "Boolean")

Aktualisiert:

Für # 1 habe ich lookbehind

verwendet %Vor%

Für # 2 habe ich Lookahead benutzt.

%Vor%

Dies wird höchstwahrscheinlich für meine Situation funktionieren, aber wie steht es mit den folgenden Verbesserungen?

3) Nicht übereinstimmen, wenn in der Mitte einer Zeichenfolge (danke nohat ).
4) Nicht übereinstimmen, wenn in einem Kommentar. (// oder / ** /)

    
KannoN 29.08.2008, 19:59
quelle

9 Antworten

3
  

s / [^:] \ bBoolean \ b (?! ") / bool / g

Dies stimmt nicht mit Zeichenfolgen überein, in denen Boolean am Anfang der Zeile steht, weil [^:] "mit einem Zeichen übereinstimmt, das nicht:" ist.

    
KannoN 29.08.2008 20:20
quelle
2

Achten Sie auf diese Zitat-Matching-Lookahead-Assertion. Das passt nur, wenn Boolean der letzte Teil einer Zeichenfolge ist, aber nicht in der Mitte der Zeichenfolge. Sie müssen eine gerade Anzahl an Anführungszeichen vor der Übereinstimmung angeben, wenn Sie sicher sein möchten, dass Sie sich nicht in einer Zeichenfolge befinden (vorausgesetzt, es sind keine mehrzeiligen Zeichenfolgen und keine eingebetteten Anführungszeichen vorhanden).

    
nohat 29.08.2008 21:36
quelle
1
%Vor%

Bearbeiten: Ratten, wieder geschlagen. +1 für das Schlagen von mir, guter Herr.

    
Daniel Jennings 29.08.2008 20:12
quelle
1
%Vor%

Lassen Sie den Vorarbeiter darauf achten. Jedes Mal, wenn Sie einen booleschen Wert sehen, können Sie ihn entweder manuell korrigieren oder hoffen, dass ein Regex keinen Fehler macht. Abhängig davon, wie viele Makros du verwendest, kannst du das aus cpp herauswerfen.

    
nimish 18.09.2008 18:13
quelle
0

Um die Bedingung 1 zu beheben, versuchen Sie:

%Vor%

Das [^:] sagt, dass ein beliebiges anderes Zeichen als ":" gefunden werden soll.

    
John Meagher 29.08.2008 20:11
quelle
0
___ qstnhdr ___ Regex zum Ersetzen von Boolean durch bool ___ answer35358 ___

Achten Sie auf diese Zitat-Matching-Lookahead-Assertion. Das passt nur, wenn Boolean der letzte Teil einer Zeichenfolge ist, aber nicht in der Mitte der Zeichenfolge. Sie müssen eine gerade Anzahl an Anführungszeichen vor der Übereinstimmung angeben, wenn Sie sicher sein möchten, dass Sie sich nicht in einer Zeichenfolge befinden (vorausgesetzt, es sind keine mehrzeiligen Zeichenfolgen und keine eingebetteten Anführungszeichen vorhanden).

    
___ answer35203 ___
%Vor%

Bearbeiten: Ratten, wieder geschlagen. +1 für das Schlagen von mir, guter Herr.

    
___ qstntxt ___

Ich arbeite an einer C ++ - Code-Basis, die vor kurzem von X / Motif nach Qt verschoben wurde. Ich versuche, ein Perl-Skript zu schreiben, das alle Vorkommen von Boolean (von X) durch Bool ersetzt. Das Skript macht nur einen einfachen Ersatz.

%Vor%

Es gibt ein paar Bedingungen.

1) Wir haben CORBA in unserem Code und \ b entspricht CORBA :: Boolean, was nicht geändert werden sollte.
2) Es sollte nicht übereinstimmen, wenn es als eine Zeichenfolge gefunden wurde (d. H. "Boolean")

Aktualisiert:

Für # 1 habe ich lookbehind

verwendet %Vor%

Für # 2 habe ich Lookahead benutzt.

%Vor%

Dies wird höchstwahrscheinlich für meine Situation funktionieren, aber wie steht es mit den folgenden Verbesserungen?

3) Nicht übereinstimmen, wenn in der Mitte einer Zeichenfolge (danke nohat ).
4) Nicht übereinstimmen, wenn in einem Kommentar. (// oder / ** /)

    
___ answer35220 ___
  

s / [^:] \ bBoolean \ b (?! ") / bool / g

Dies stimmt nicht mit Zeichenfolgen überein, in denen Boolean am Anfang der Zeile steht, weil [^:] "mit einem Zeichen übereinstimmt, das nicht:" ist.

    
___ answer35198 ___

Um die Bedingung 1 zu beheben, versuchen Sie:

%Vor%

Das [^:] sagt, dass ein beliebiges anderes Zeichen als ":" gefunden werden soll.

    
___ answer95149 ___
%Vor%

Lassen Sie den Vorarbeiter darauf achten. Jedes Mal, wenn Sie einen booleschen Wert sehen, können Sie ihn entweder manuell korrigieren oder hoffen, dass ein Regex keinen Fehler macht. Abhängig davon, wie viele Makros du verwendest, kannst du das aus cpp herauswerfen.

    
___ antwort43729 ___
  

3) Nicht übereinstimmen, wenn in der Mitte einer Zeichenfolge (danke Nohat).

Sie können vielleicht eine Registrierung schreiben, um ". * Boolean. *" zu überprüfen. Aber was, wenn Sie ein Zitat (") in der Zeichenkette haben? So haben Sie mehr Arbeit, um (\") Muster nicht auszuschließen.

  

4) Nicht übereinstimmen, wenn in einem Kommentar. (// oder / * * /)

Für '//' können Sie eine Regex zum Ausschließen von //.* verwenden. Besser wäre es aber, zuerst eine Regex einzufügen, um die gesamte Zeile für die // Kommentare zu vergleichen ((*) (//.*) )) und dann Ersatz nur auf $ 1 anwenden (erstes übereinstimmendes Muster).

Für / * * / ist es komplexer, da es sich um ein mehrzeiliges Muster handelt. Ein Ansatz kann darin bestehen, zuerst ganzen Code auszuführen, um mehrzeiligen Kommentaren zu entsprechen und dann nur die Teile herauszunehmen, die nicht übereinstimmen ... etwas wie ... (. *) (/*.**/) (. *). Aber die tatsächliche Regex wäre noch komplexer, da Sie nicht mehr als einen mehrzeiligen Kommentar hätten.

Was passiert nun, wenn Sie / * oder * / innen // blockieren? (Ich weiß nicht, warum würdest du es haben ... aber Murphys Gesetz sagt, dass du es haben kannst). Es gibt offensichtlich einen Ausweg, aber meine Idee ist es zu betonen, wie schlecht die Regex aussehen wird.

Mein Vorschlag wäre hier, ein lexikalisches Werkzeug für C ++ zu verwenden und den booleschen Token durch bool zu ersetzen. Deine Gedanken?

    
___ answer88938 ___

Der "Boolesche" in der Mitte eines String-Teils klingt etwas unwahrscheinlich, ich würde zuerst prüfen, ob es etwas im Code mit etwas wie

gibt %Vor%

Und wenn es keine oder wenige gibt, ignoriere diesen Fall einfach.

    
___ answer86617 ___

Um das Schreiben eines vollständigen C-Parsers in Perl zu vermeiden, versuchen Sie, ein Gleichgewicht zu finden. Abhängig davon, wie stark sich die Bedürfnisse ändern, würde ich geneigt sein, etwas sehr restriktives s /// zu tun, und dann wird alles, was noch passt / Boolean / in eine Ausnahmedatei für menschliche Entscheidungen geschrieben. Auf diese Weise versuchen Sie nicht, die mittleren C-Strings, den mehrzeiligen Kommentar, den bedingten kompilierten Text usw. zu analysieren.

    
___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ answer86920 ___
  
  1. ...
  2.   
  3. ...
  4.   
  5. Nicht übereinstimmen, wenn in der Mitte eines Strings (danke nohat).
  6.   
  7. Nicht übereinstimmen, wenn in einem Kommentar. (// oder / ** /)
  8.   

Nein kann mit einem einfachen Regex umgehen. Dafür musst du jedes einzelne Zeichen von links nach rechts betrachten und entscheiden, was es ist, zumindest gut genug, um Kommentare von mehrzeiligen Kommentaren von Strings von anderen zu unterscheiden stuff und then müssen Sie sehen, ob der Teil "sonstiges" Dinge enthält, die Sie ändern möchten.

Nun kenne ich die exact syntaktischen Regeln für Kommentare und Strings in C ++ nicht, so dass das Folgende ungenau und völlig unerbittlich ist, aber es wird Ihnen eine Vorstellung von der Komplexität geben Sie sind dagegen.

%Vor%

Bitte bitte mich nicht, dies in all seinen Feinheiten zu erklären, es würde mich einen Tag brauchen und einen anderen. Kaufen und lesen Sie Jeff Friedls Reguläre Ausdrücke beherrschen , wenn Sie genau wissen wollen, was hier vor sich geht.

>     
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___
Jagmal 04.09.2008 13:14
quelle
0

Um das Schreiben eines vollständigen C-Parsers in Perl zu vermeiden, versuchen Sie, ein Gleichgewicht zu finden. Abhängig davon, wie stark sich die Bedürfnisse ändern, würde ich geneigt sein, etwas sehr restriktives s /// zu tun, und dann wird alles, was noch passt / Boolean / in eine Ausnahmedatei für menschliche Entscheidungen geschrieben. Auf diese Weise versuchen Sie nicht, die mittleren C-Strings, den mehrzeiligen Kommentar, den bedingten kompilierten Text usw. zu analysieren.

    
piCookie 17.09.2008 19:20
quelle
0
  
  1. ...
  2.   
  3. ...
  4.   
  5. Nicht übereinstimmen, wenn in der Mitte eines Strings (danke nohat).
  6.   
  7. Nicht übereinstimmen, wenn in einem Kommentar. (// oder / ** /)
  8.   

Nein kann mit einem einfachen Regex umgehen. Dafür musst du jedes einzelne Zeichen von links nach rechts betrachten und entscheiden, was es ist, zumindest gut genug, um Kommentare von mehrzeiligen Kommentaren von Strings von anderen zu unterscheiden stuff und then müssen Sie sehen, ob der Teil "sonstiges" Dinge enthält, die Sie ändern möchten.

Nun kenne ich die exact syntaktischen Regeln für Kommentare und Strings in C ++ nicht, so dass das Folgende ungenau und völlig unerbittlich ist, aber es wird Ihnen eine Vorstellung von der Komplexität geben Sie sind dagegen.

%Vor%

Bitte bitte mich nicht, dies in all seinen Feinheiten zu erklären, es würde mich einen Tag brauchen und einen anderen. Kaufen und lesen Sie Jeff Friedls Reguläre Ausdrücke beherrschen , wenn Sie genau wissen wollen, was hier vor sich geht.

>     
Aristotle Pagaltzis 17.09.2008 19:49
quelle
0

Der "Boolesche" in der Mitte eines String-Teils klingt etwas unwahrscheinlich, ich würde zuerst prüfen, ob es etwas im Code mit etwas wie

gibt %Vor%

Und wenn es keine oder wenige gibt, ignoriere diesen Fall einfach.

    
Victor 18.09.2008 00:35
quelle

Tags und Links