Domanda

Dato il seguente codice:

var myList = new List<string> { "red shirt", "blue", "green", "red" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie");

voglio il risultato di m per includere "red shirt", "blue", "red" dal momento che tutti coloro che sono nella stringa, ma io sono solo ottenendo "red shirt", "blue". Che cosa posso fare per includere sovrapposizioni?

È stato utile?

Soluzione

Mi sembra che il parser regexp sta rimuovendo la stringa partita non appena viene trovato il primo match valido. Non hai ancora un Windows l'installazione del compilatore in questo momento, quindi non posso dare un mele a confronto le mele ma vedere risultati simili in perl.

Credo che la vostra regex sarebbe simile a questo dopo essere uniti.

'\ b (camicia rossa | blu | verde | rosso) \ b'

Test questa espressione regolare fuori vedo lo stesso risultato di "camicia rossa", "blu". Spostando "camicia rossa" al fine della lista regexp.

'\ b (red | blu | verde | camicia rossa) \ b'

ora vedo "rosso", "blu".

Modificando l'espressione regolare per un po 'di un approccio più complicata si potrebbe essere in grado di raggiungere i risultati desiderati.

\ b (blu | verde | (rossa) della camicia) \ b

Questo dovrebbe corrispondere rosso come un proprio sottogruppo e camicia rossa come gruppo pure.

I ritorni "camicia rossa", "rosso", "blu"

Il modo più semplice per farlo sarebbe quello di ciclo attraverso la vostra lista di stringhe e abbinare 1 alla volta, se avete intenzione di avere molti gruppi di parole che dovranno più corrispondenze come camicia rossa e il rosso.

Dal momento che ci sono tanti modi per fare regexp, sto probabilmente manca una soluzione ovvia ed elegante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top