2016-03-23 11 views
5

devo stringhe di ingresso come sottoScegliere la corrispondenza esatta cifra da una stringa

1) ISBN_9781338034424_001_S_r1.mp3

2) 001_Ch001_987373737.mp3

3) Questa è la prova 001 Chap01.mp3

4) Anger_Cha01_001.mp3

e sto usando qui sotto regex per raccogliere "001" in gruppo tracknumber

(?:(?<TrackNumber>\d{3})|(?<Revision>r\d{1}))(?![a-zA-Z]) 

Tuttavia, quanto sopra anche raccogliendo "978", "133", "803" e così via nel gruppo TrackNumber (esempi 1 e 2).

Come modificare la regex precedente per selezionare solo "001" in TrackNumber?

-Alan-

+2

È il vostro modello include sempre con '_'? Forse hai bisogno di 'Split' con quel personaggio e prendere il terzo elemento di esso? –

+0

Può avere spazi qualche volta –

+0

'(? :(? \ d {3}) _ [AZ] (? r \ d {1})) (?! [A-zA-Z])' –

risposta

3

La seguente espressione regolare corrisponderà al numero di traccia 3 cifre in tutti i vostri esempi:

(?<=\b|_)(?<TrackNumber>\d{3})(?=\b|_) 
  • (?<=\b|_) lookbehind positiva, che il carattere precedente è o un confine di parola (cioè uno spazio) o un trattino basso
  • (?=\b|_) lookahead positivo, che il carattere successivo è o un limite di parole (cioè uno spazio) o un trattino basso

Demo

+0

soluzione impressionante :) –