2013-08-01 10 views
8

desidera far corrispondere parola i.v. case insensitiveRegex usando il limite della parola ma la parola termina con a. (Punto)

hanno modello

(?i)\bi\.v\. 

ma vuole un confine di parola sulla fine
il modello precedente non riesce a che corrisponda
IVX

ma se provo ad aggiungere un confine di lavoro alla fine

(?i)\bi\.v\.\b 

non riesce nemmeno a far corrispondere i.v. come penso che il \b stia mangiando il letterale. come . è una parola rompere
bisogno del \. essere avidi

voglio abbinare
sam e.v. sam

non corrispondono a
sam.i.v.
i.v.sam

Questa avvicinarsi

(?i)\bi\.v\.\s$ 

Ma non riesce a trovare e.v. alla fine di una linea

+1

Qual è il tuo problema? Perché vuoi un '\ b' alla fine dell'espressione? Cosa può seguire questa stringa 'i.v' quando è consentita la corrispondenza? – Qtax

+0

@Qtax perché voglio solo una corrispondenza di parole. Il primo pattern corrisponderà a i.v.x. – Paparazzi

+0

Vuoi abbinare "i.v.x", ma non corrisponde a "xxi.v.x"? Che dire di "i.v. x" (con uno spazio tra il. E l'x)? –

risposta

16

\b corrisponde solo tra un carattere alfanumerico e un carattere non alfanumerico (o l'inizio/fine della stringa). Pertanto, non corrisponde a ., a meno che un carattere alfanumerico non segua immediatamente tale punto.

Se il vostro intento è quello di fare in modo che nessun carattere non di spaziatura segue dopo il punto, allora si può specificare che l'utilizzo di un negative lookahead assertion:

(?i)\bi\.v\.(?!\S) 

(?!\S) significa "affermare che il carattere successivo non è un non -il carattere spazio vuoto ".

Questo può sembrare un po 'contorto: perché il doppio negativo? Perché non (?=\s) che significa "Asserisci che il prossimo carattere è un carattere di spazio bianco"? Bene, c'è una sottile differenza: la seconda versione richiede che ci sia un carattere di spazio bianco; ciò significa che la regex non corrisponderà alla fine della stringa. La prima regex gestisce anche quella cassa d'angolo.

Se si desidera in generale il concetto di "limite di parola" per significare "spazio-delimitato", allora avete bisogno di sostituire il primo \b così:

(?i)(?<!\S)i\.v\.(?!\S) 

o l'espressione regolare corrisponderà sam.i.v. che don sembra che lo vogliano.

+0

Ha senso e funziona – Paparazzi

+0

La tua recente modifica alla tua domanda mi ha confuso un po '(l'ho letto solo dopo aver scritto la mia risposta) - Ho commentato la tua domanda, potresti guardarla? Penso che sia necessario sostituire anche il primo limite di parole ... –

+0

Sono d'accordo. \ b corrisponde su? i.v. – Paparazzi

2

Informazioni sul regex corrente:

Non c'è bisogno di avere \b dopo il punto dal dot non è considerato un carattere di parola, ma, naturalmente, ha bisogno di essere sfuggito dot:

(?i)\bi\.v\. 

Ma è necessario \b prima di i per assicurarsi che non corrisponda ad es. hi

EDIT: (in base alle ulteriori modifiche)

Prova questa espressione regolare:

(?i)\bi\.v\.(?=\s|$) 
+0

non riesce su sam i.v. sam – Paparazzi

+0

Pls controlla questa demo: http://www.rubular.com/r/dXRpW6aaey – anubhava

+0

Questo è nella mia domanda come campione Voglio corrispondere a – Paparazzi

-1

È sembra essere molto confondere con i confini di parole e nozioni avidi. La cosa migliore che puoi fare è di andare a questi indirizzi:

  • Che cosa è un quantificatore avido:

http://www.regular-expressions.info/repeat.html

  • quello che è un confine di parola:

http://www.regular-expressions.info/wordboundaries.html

Quando leggerete queste spiegazioni, sono sicuro che penserete che il vostro problema fosse ridicolo.

+0

Perché il downvote? Perché non ho dato la risposta? –

+0

Penso di aver fatto quello che dovevo fare, e non mi importa di altre opinioni. –

+0

Mostra come creare \. avido e ti darò +1 – Paparazzi

Problemi correlati