2013-04-23 20 views
9

Come trovare questo modello usando regex?Espressione regolare per trovare commenti del blocco di stile C

Blocca i commenti in stile C

/* xxxxxxxxxxxx */

+0

Cosa succede se '/ *' è sulla stessa riga e dopo un '//', nel senso che non inizia un commento? – Patashu

+0

No, non ho bisogno di gestire tale situazione – linquize

+0

Oltre a utilizzare le espressioni regolari, se si desidera andare a tutto esaurito è possibile utilizzare un parser di lingua con una grammatica di linguaggio C (o qualsiasi altra cosa). Esempi sono yacc, javacc, antlr –

risposta

1

mi raccomando solo usando un parser, come i commenti, ma se solo per divertimento - off superiore della mia testa, si potrebbe fare qualcosa di simile utilizzando Ruby, supponendo che si sa già come ottenere i contenuti da un file (tenere a mente questo è molto agitato e solo una possibile guida - prolly non funziona out of the box):

def one_liner_comment string 
    string.match /\/\*.*\*\// 
end 

def multi_liner_comment_start string 
    # if always checking for one_liner_comment in code would not need first !one_... 
    !one_liner_comment(string) && string.match(/\/\*/) 
end 

def multi_liner_comment_end string 
# if always checking for one_liner_comment in code would not need first !one_... 
!one_liner_comment(string) && string.match(/\*\//) 
end 

Poi per determinare dove vi sono solo

Quindi eseguire tutto ciò che si desidera fare con i tuoi commenti da qui in poi.

if inline 
    # do whatever you want 
    one_liner = false 
elsif started && !ended 
    # do whatever you want -> append or create new string 
elsif started && ended 
    # do whatever you want -> append to string 
    started = false 
    ended = false 
end 

sicuro che potrebbe anche essere ripulito ...

20

Prova utilizzando

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

per catturare singola linea e commenti a blocchi multilinea. Esso cerca /* seguita da un numero qualsiasi di uno:

  • un * che non è seguito da un /
  • qualsiasi carattere tranne*

e quindi la chiusura */ nuovamente.

+0

Non è necessario abbinare caratteri di spaziatura in un ramo separato; '[^ * /]' li ha coperti. Tutto il '| \ s' è aperto a [backtracking catastrofico] (http://www.regular-expressions.info/catastrophic.html). Inoltre, è necessario rimuovere quella barra, altrimenti la regex non riuscirà a far corrispondere i commenti con barre all'interno. –

+0

Modificato sui suggerimenti (sebbene OP abbia detto che i commenti con barre non sembrano essere un problema) – Campfire

+0

perché non '/\*(.(?!\*/))*\*/'? prima un '/ *' quindi qualsiasi carattere non seguito da '* /' then '* /' – zzh1996

Problemi correlati