RegExpr per generare codice HTML da una stringa

di il
2 risposte

RegExpr per generare codice HTML da una stringa

Supponiamo di avere i seguenti esempi di scritture markdown

# This is level 1 (article title)
## This is level 2
### This is level 3
#### This is level 4
##### This is level 5

vorrei qualche idea su come implementare una regexpr in java per trasformare in html le stringhe sopra
Il risultato dovrebbe essere qualcosa del tipo:

<h1>This is level 1 (article title)</h1>
<h2>This is level 2</h2>
<h3>This is level 3</h3>
<h4>This is level 4</h4>
<h5>This is level 5</h5>

2 Risposte

  • Re: RegExpr per generare codice HTML da una stringa

    whisky90 ha scritto:


    vorrei qualche idea su come implementare una regexpr in java per trasformare in html le stringhe sopra
    Dubito che si possa fare con una singola espressione regolare: dovresti crearne una per ogni livello di titolo, contando il numero di caratteri "#" che si trovano all'inizio e isolando in un gruppo la parte del testo, andando poi a usare le funzioni di replace delle espressioni o, in alternativa, una banale estrazione del valore del gruppo stesso (quindi il testo del titolo) da inserire in una stringa con il tag.

    Come espressione, potrebbe starci qualcosa del tipo
    (\#{1,5})\s+(.*)

    Mettendo i caratteri "#" in un gruppo a sé stante, guardando la loro lunghezza potresti anche individuare qual è il livello del titolo.

    Secondo me, le espressioni regolari possono essere sufficienti ma non avrebbero la stessa potenzialità di un parser vero e proprio.

    Ciao!
  • Re: RegExpr per generare codice HTML da una stringa

    whisky90 ha scritto:


    vorrei qualche idea su come implementare una regexpr in java per trasformare in html le stringhe sopra
    Premesso che esistono già librerie Java per il parsing di Markdown e la generazione del relativo HTML (ma non so dire ora quanto siano aggiornate/complete), la questione è che bisognerebbe anche vedere da cosa parti. Hai una stringa che contiene solo una riga di intestazione? O hai una grossa stringa che contiene tutto il documento su cui vuoi fare le sostituzioni "a tappeto"?

    Comunque, con una sola regex e un replace "secco" non si può fare. Questo è un classico esempio di replace "complesso", come ad esempio quando hai una stringa es. "valore 1234" e vuoi fare un replace per ottenere il valore in hex "valore 4d2".
    Con il solo replaceAll() (di String o di Matcher) NON si può fare.

    Si può fare usando un loop e sfruttando gli appendReplacement/appendTail di Matcher, che sono stati fatti apposta proprio per questo tipo di replace "complessi" (vedi javadoc di dove mostra un esempio).

    Da Java 9 il Matcher ha una variante sul replaceAll/replaceFirst molto interessante ed utile:

    String replaceAll(Function<MatchResult,String> replacer)
    String replaceFirst(Function<MatchResult,String> replacer)

    Ovvero passare una funzione in grado di fornire la stringa per un replace "complesso". Ecco proprio l'esempio descritto sopra:
    import java.math.BigInteger;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class ProvaReplace {
        public static void main(String[] args) {
            String input = "valore 1234";
    
            Pattern pattern = Pattern.compile("[0-9]+");   // una o più cifre
            Matcher matcher = pattern.matcher(input);
    
            String output = matcher.replaceAll(match -> {
                String numero = match.group();    // il numero catturato dal pattern (es. "1234")
                return new BigInteger(numero).toString(16);
            });
    
            System.out.println(output);   // stampa: valore 4d2
        }
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte