2012-12-27 28 views
6

È possibile utilizzare un'espressione regolare per abbinare tutte le parole ma abbinare parole univoche solo una volta? Sono consapevole che ci sono altri modi per farlo, ma sono interessato a sapere se ciò è possibile con l'uso di un'espressione regolare.Espressione regolare - corrisponde a tutte le parole ma corrisponde a parole univoche solo una volta

Per esempio Al momento ho la seguente espressione:

(\w+\b)(?!.*\1) 

e la seguente stringa:

glass shoes door window door glasses. window glasses 

Per la maggior parte l'espressione funziona e soddisfa le seguenti parole:

shoes 
door 
window 
glasses 

Ci sono due problemi con questo:

  1. Un match per una sottostringa viene eseguito su "occhiali" con "vetro", non è corretto.

  2. "occhiali" e "occhiali". dovrebbe corrispondere ma attualmente non lo fanno.

La finale dovrebbe essere:

shoes 
door 
window 
glasses 
glass 

risposta

7

Abbastanza vicino, basta readd il \b nel lookahead negativo

/(\w+\b)(?!.*\1\b)/ 

vedere sul Rubular

+0

mi chiedo perché '\ 1' a quanto pare non corrisponde al' \ b' dal primo gruppo. Non dovresti '\ 1' abbinare tutto all'interno del gruppo e non solo' \ w + '? – pemistahl

+0

@ maček Wow! Grazie mille, ho praticamente passato due giorni di fila cercando di capirlo! – Isomorph

+0

@PeterStahl Il motivo per cui è necessario aggiungere '\ b' è assicurarsi che il lookahead negativo corrisponda a una parola intera e non solo una sottostringa, per impostazione predefinita corrisponde alle sottostringhe. – Isomorph

2

Esattamente come maček's answer, ma con un extra \ b prima del riferimento all'indietro, otherw ISE se aveste

glass shoes door window door glasses. window glasses sunglasses

Faresti perdere una partita per occhiali, come lo trova nella parola occhiali da sole.

/(\w+\b)(?!.*\b\1\b)/

+0

Dovresti anche aggiungere un '\ b' prima di' \ w' non fallire per 'occhiali da sole' – Titus

Problemi correlati