2013-04-23 12 views
9

Jak znaleźć ten wzór za pomocą wyrażeń regularnych?Wyrażenie regularne, aby znaleźć komentarze bloku stylu C

C stylu komentarze blokowe

/* xxxxxxxxxxxx */

+0

Co jeśli '/ *' jest w tej samej linii i po znaku '//', co oznacza, że ​​nie uruchamia komentarza? – Patashu

+0

Nie, nie potrzebuję obsłużyć takiej sytuacji. – linquize

+0

Oprócz używania wyrażeń regularnych, jeśli chciałeś przejść na całość, możesz użyć parsera językowego z gramatyką języka C (lub czegoś podobnego). Przykładami są yacc, javacc, antlr –

Odpowiedz

1

Gorąco polecam tylko przy użyciu parser, jak komentarze, ale jeśli po prostu dla zabawy - przy mojej głowie, można zrobić coś takiego za pomocą Ruby zakładając, że już wie, jak uzyskać zawartość z pliku (należy pamiętać, jest to bardzo niebezpieczne i tylko możliwe guide - naprawde nie będzie działać po wyjęciu z opakowania):

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 

Następnie, aby określić, gdzie jesteś tylko

if one_liner(string) 
    inline = true 
elsif multi_liner_comment_start(string) 
    started = true 
elsif started && multi_liner_comment_end(string) 
    ended = true 
end 

Następnie wykonaj co chcesz zrobić ze swoimi komentarzami stąd.

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 

Oczywiście może to być również oczyszczone ...

20

Spróbuj użyć

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

uchwycić jedną linię i komentarze blok obsługujący kilka linii. Wyszukuje /* następnie dowolną liczbę albo:

  • się * że nie następuje /
  • dowolnego char wyjątkiem*

a następnie ponownie zamykanie */.

+0

Nie musisz dopasowywać białych znaków w oddzielnym oddziale; '[^ * /]' ma je pokryte. Wszystkie '' \ s' są otwarte na [katastroficzne cofanie] (http://www.regular-expressions.info/catastrophic.html). Trzeba też wydostać się z tego slashu, inaczej regex nie dopasuje komentarzy do ukośników wewnątrz nich. –

+0

Zmieniono na twoje sugestie (chociaż OP powiedział, że komentarze z ukośnikami nie wydają się być problemem) – Campfire

+0

dlaczego nie '/\*(.(?!\*/))*\*/'? najpierw "/ *", a następnie dowolny znak nie poprzedzony przez '* /', a następnie '* /' – zzh1996

Powiązane problemy