2016-05-22 9 views
1

Ich bin ein sehr großes C-Projekt refactoring und ich muss herausfinden, einen Teil des Codes von bestimmten Programmierer geschrieben. Glücklicherweise markiert jeder an diesem Projekt beteiligte Typ seinen eigenen Code unter Verwendung seiner E-Mail-Adresse in Standard-C-Style-Kommentaren.Regex: extrahieren Sie Text zwischen zwei Zeichenfolgen mit Text, der zu einem bestimmten Wort

Ok, jemand könnte sagen, dass dies leicht mit einem Grep von der Befehlszeile erreicht werden könnte, aber das ist nicht mein Ziel: Ich muss diese Kommentare entfernen oder sie mit anderem Text ersetzen, so Regex ist die einzige Lösung.

Ex.

/********************************************* 
* 
* ... some text .... 
* 
* author: [email protected] 
* 
*********************************************/ 

Von this post fand ich den richtigen Ausdruck für C Stil Kommentare zu suchen, die ist:

\/\*(\*(?!\/)|[^*])*\*\/ 

Aber das ist nicht genug! Ich brauche nur die Kommentare, die eine bestimmte E-Mail-Adresse enthalten. Glücklicherweise scheint die Domäne der E-Mail-Adresse, die ich suche, im gesamten Projekt einzigartig zu sein, so dass dies die Arbeit vereinfachen könnte.

Ich glaube, ich einige positive vorwärtsgerichtete Behauptung verwenden müssen, habe ich dieses versucht:

(\/\*)(\*(?!\/)|[^*](?=.*domain.com))*(\*\/) 

aber es läuft nicht! Irgendwelche Ratschläge?

+0

['\/\ * [^ *] * (?: \ * (?! \ /) [^ *] *) * @ Domäne \ .com [^ *] * (?: \ * (?! \ /) [^ *] *) * \ * \/'] (https://regex101.com/r/nW8uP2/1)? –

+0

'\/\ *. * Autor:. * @ Domain \ .com. *? \ * \ /' Sollte übereinstimmen. – Saleem

+0

@Saleem, [es wird übersteuert] (https://regex101.com/r/mV2bU2/1), verlassen Sie sich nicht auf '. *', Wenn Sie mit dem Abgleich innerhalb eines markierten Textes arbeiten. –

Antwort

0

können Sie verwenden

\/\*[^*]*(?:\*(?!\/)[^*]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/ 

Siehe regex demo

Muster Details:

  • /\* - Kommentar starten
  • [^*]*(?:\*(?!\/)[^*]*)* - alles aber */
  • @domain\.com - wörtliche domain.com
  • [^*]*(?:\*(?!\/)[^*]*)* - alles aber */
  • \*\/ - Kommentar Ende

Eine schnellere Alternative (wie der erste Teil wird für alles, aber das Kommentar Ende und das Wort sucht @domain):

\/\*[^*@]*(?:\*(?!\/)[^*@]*|@(?!domain\.com)[^*@]*)*@domain\.com[^*]*(?:\*(?!\/)[^*]*)*\*\/ 

S ee another demo

In diesen Mustern verwendete ich ein entrolltes Konstrukt für (\*(?!\/)|[^*])*: [^*]*(?:\*(?!\/)[^*]*)*. Unrolling hilft, effizientere Muster zu konstruieren.