Chi si è cimentato nel parsing di HTML mediante regular expressione probabilmente ha sbattuto contro il seguente problema:
Poniamo ad esempio di fare il match di una coppia <td></td> in una tabella come la seguente:
1: <table>
2: <tr>
3: <td>Cella1</td>
4: <td>Cella2</td>
5: </tr>
6: </table>
Potremmo usare una regular expression siffatta:
MatchCollection matches = Regex.Matches(@"<td>.*</td>");
Purtroppo il risultato è diverso da quello che ci si può aspettare. Infatti il motore di risoluzione delle regular-expressions in .NET così come in molti altri linguaggi è ottimistico e tenta sempre di effettuare il match più largo possibile. Perciò il risultato del precedente pattern è:
1: <td>Cella1</td><td>Cella2</td>
(il numero indica la quantità di match in MatchCollection)
Per ottenere un matching "non-greedy" (letteralmente non-ingordo) cioe esattamente quello che ci si sarebbe aspettato è necessario modificare il pattern introducendo un ? dopo il carattere che quantifica le ripetizioni:
MatchCollection matches = Regex.Matches(@"<td>.*?</td>");
Ed ecco che il risultato diventa
1: <td>Cella1</td>
2: <td>Cella2</td>
Fonte: LBSharp.com: .NET Regular Expressions