La mia espressione regolare corrisponde troppo.Come posso farlo smettere?

StackOverflow https://stackoverflow.com/questions/22444

  •  09-06-2019
  •  | 
  •  

Domanda

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

Ho questa stringa gigantesca e brutta e sto cercando di estrarne dei pezzi usando regex.

In questo caso, voglio prendere tutto dopo "Nome progetto" fino alla parte in cui dice "J0000011:" (l'11 sarà un numero diverso ogni volta).

Ecco la regex con cui ho giocato

Project name:\s+(.*)\s+J[0-9]{7}:

Il problema è che non si ferma finché non colpisce il J0000020: alla fine.

Come faccio a fermare l'espressione regolare alla prima occorrenza di J[0-9]{7}?

È stato utile?

Soluzione

Fare .* non avido aggiungendo '?' dopo ciò:

Project name:\s+(.*?)\s+J[0-9]{7}:

Altri suggerimenti

Utilizzare quantificatori non greedy in questo caso è probabilmente la soluzione migliore, anche perché è più efficiente dell'alternativa greedy:Gli abbinamenti golosi in genere vanno fino in fondo (qui, fino alla fine del testo!) e poi risalgono carattere dopo carattere per cercare di abbinare la parte che viene dopo.

Tuttavia, considera invece l'utilizzo di una classe di caratteri negativi:

Project name:\s+(\S*)\s+J[0-9]{7}:

\S significa “tutto tranne uno spazio bianco e questo è esattamente quello che vuoi.

BENE, ".*" è un avido selezionatore.Lo rendi non avido usando ".*?" Quando si utilizza quest'ultimo costrutto, il motore regex, ad ogni passaggio, corrisponderà al testo nel file "." tentare di abbinare qualunque cosa venga dopo ".*?".Ciò significa che se ad esempio non viene nulla dopo il ".*?", quindi non corrisponde a nulla.

Ecco cosa ho usato. s contiene la stringa originale.Questo codice è specifico di .NET, ma la maggior parte delle versioni di espressioni regolari avrà qualcosa di simile.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

Ti consiglierei anche di sperimentare le espressioni regolari utilizzando "Expresso": è un'utilità eccezionale (e gratuita) per la modifica e il test delle espressioni regolari.

Uno dei suoi vantaggi è che la sua interfaccia utente espone molte funzionalità regex con cui le persone inesperte potrebbero non avere familiarità, in modo che sarebbe facile per loro apprendere questi nuovi concetti.

Ad esempio, quando crei la tua espressione regolare utilizzando l'interfaccia utente e scegliendo "*", hai la possibilità di selezionare la casella di controllo "Il meno possibile" e vedere l'espressione regolare risultante, nonché testarne il comportamento, anche se non ne hai familiarità espressioni non avide prima.

Disponibile per il download sul loro sito:http://www.ultrapico.com/Expresso.htm

Scaricamento rapido:http://www.ultrapico.com/ExpressoDownload.htm

(Nome progetto:\s+[A-Z]:(?:\\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

Questo funzionerà per te.

L'aggiunta di (?:\\w+)+.[a-zA-Z]+ sarà più restrittiva anziché .*

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