Certo, utilizzare unrolling-the-loop technique:
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
Vedi regex demo
Il srotolando la tecnica ciclo si basa sull'ipotesi che nella maggior parte dei casi, è sempre conosciuto in un alternarsi repeteated, qual caso dovrebbe essere il più comune e quale è eccezionale. Chiameremo il primo, il caso normale e il secondo, il caso speciale. La sintassi generale del srotolando la tecnica ciclo potrebbe quindi essere scritta come:
normal* (special normal*)*
Il che potrebbe significa qualcosa di simile, abbinare il caso normale, se si trova un caso speciale, abbinato esso che corrisponda ancora una volta il caso normale . Si nota che parte di questa sintassi potrebbe portare a una corrispondenza super-lineare. Per evitare una partita senza fine per aggiungere le seguenti regole shoud essere applicate con attenzione:
- l'inizio del caso particolare e il caso normale deve essere reciprocamente esclusive
- speciale deve sempre corrispondere almeno un carattere
- l'espressione speciale deve essere atomica: fare attenzione al fatto che
(special normal*)*
potrebbe essere ridotto a (special)*
, che se speciale è special*
, questo è diventato simile a (a*)*
che è un'espressione indeterminata.
dichiarazione C# modello (utilizzando una stringa verbatim letterale):
var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";
La ripartizione regex:
/\*
- letterale /*
[^*]*
-0 o più carattere diverso di *
(?:\*(?!/)[^*]*)*
- 0 o più sequenze di ...
\*(?!/)
- un letterale *
non seguita da /
[^*]*
- 0 o più caratteri diverso *
\*/
- letterale */
Qui è un grafico mostrante quanto sia efficiente il 3 regexps potenzialmente identici sono (testati allo regexhero.net *):
* testato contro /* Comment * Typical * Comment */
fonte
2015-11-24 14:12:17
Le prestazioni di utilizzo di ghiottoneria contro non grezze possono dipendere dalla lunghezza del commento. –