Java Regexp: flag UNGREEDY

Mi piacerebbe portre un generico strumento di elaborazione del text, Texy! , da PHP a Java.

Questo strumento esegue il matching ungreedy ovunque, usando preg_match_all("/.../U") . Quindi sto cercando una biblioteca con qualche bandiera UNGREEDY .

So che potrei usare il .*? syntax, ma ci sono davvero molte espressioni regolari che dovrei sovrascrivere e controllarle con each versione aggiornata.

Ho controllato

  • ORO – sembra essere abbandonato
  • Jakarta Regexp – nessun supporto
  • java.util.regex – nessun supporto

Esiste una tale biblioteca?

Grazie, Ondra

Ti suggerisco di creare la tua libreria Java modificata. Copia semplicemente il sorgente java.util.regex nel tuo pacchetto.

La class Pattern.java di Sun JDK 1.6 offre questi flag predefiniti:

 static final int GREEDY = 0; static final int LAZY = 1; static final int POSSESSIVE = 2; 

Noterai che queste bandiere sono usate solo un paio di volte e sarebbe banale da modificare. Prendi il seguente esempio:

  case '*': ch = next(); if (ch == '?') { next(); return new Curly(prev, 0, MAX_REPS, LAZY); } else if (ch == '+') { next(); return new Curly(prev, 0, MAX_REPS, POSSESSIVE); } return new Curly(prev, 0, MAX_REPS, GREEDY); 

Basta cambiare l'ultima linea per usare la bandiera "LAZY" invece della bandiera GREEDY. Dal momento che vuoi che una libreria di espressioni regolari si comporti come quella di PHP, questo potrebbe essere il modo migliore per andare.

Aggiornamento: Dopo aver controllato i documenti ho trovato la bandiera LAZY, che è un altro termine per non-goloso. Tuttavia sembra essere disponibile solo in OpenJDK

 p = Pattern.compile("your regex here", LAZY); p.matcher("string to match") 

Risposta deprecata originale Sinceramente non penso che ce ne sia una.

L'integer punto del +? e *? è così che puoi scegliere quali sezioni fare avidamente e quali fare pigramente.

Greedy è il comportmento predefinito perché è l'uso più comune di + e * nelle espressioni regolari. In effetti non riesco a pensare a un singolo parser regex che lo faccia al contrario. Come nel caso in cui un modificatore viene usato per rendere avido qualcosa, e il default è la corrispondenza pigra.

So che questa non è la risposta che stai cercando, ma, l'unico modo in cui penso che sarai in grado di farlo funzionare è aggiungere il? a * s e +. Sul lato positivo è ansible utilizzare espressioni regolari per determinare quali devono essere modificate. O anche apportre le modifiche per te se tutti devono essere modificati. O se è ansible in grado di descrivere un model che identifica quali devono essere modificati.

Sull'idea di controllare e ricontrollare tutte le espressioni regolari, sei sicuro che le librerie di php e java concordano abbastanza sulla syntax che non dovresti farlo comunque? Quello che farei in anticipo è esaminarli tutti e scrivere alcuni test (input e output) e assicurarsi che funzionino allo stesso modo in entrambe le implementazioni. Quindi escogitare un modo per eseguirli automaticamente e sarai coperto per futuri aggiornamenti e incompatibilità. Avrai ancora bisogno di modificare le cose, ma alless saprai where.

Potresti essere in grado di utilizzare "com.caucho.quercus.lib.regexp.JavaRegexpModule". Quercus è un'implementazione Java di PHP e la libreria regex implementa i nomi dei methods e della syntax regex di PHP.