Domanda

Ho giocato con questo per un'ora o stoppa e mi hanno trovato in un blocco stradale con le utilità pattern matching Lua. Sto tentando di abbinare tutto il testo citato in una stringa e sostituirlo se necessario.

Il modello che ho messo a punto finora è: (\ [\ "\ ']?) (.-)% 1

Questo funziona in alcuni casi, ma, non tutti i casi:

Working: "This \"is a\" string of \"text to\" test with"

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"

In questo esempio non funziona vorrei che da abbinare a (ho fatto una funzione che riceve le partite che desidero, sto solo cercando un modello per l'utilizzo con gsub e curioso di sapere se un modello di lua può fare questo):

 string
 a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit

ho intenzione di continuare ad utilizzare la mia funzione, invece, per il momento, ma sono curioso di sapere se v'è un modello che potrebbe / dovrebbe essere usando e io sono solo manca qualcosa con i modelli.

(un paio di modifiche b / c ho dimenticato stackoverflows formattazione) (Un'altra modifica per fare un esempio, non html da quando è stato in testa per assunzioni che stavo cercando di analizzare HTML)

È stato utile?

Soluzione

cercando di abbinare sfuggito, testo citato utilizzando le espressioni regolari è come cercare di rimuovere le margherite (e solo le pedane) da un campo con una falciatrice.

  

Ho fatto una funzione che ottiene i risultati che desidero

Questa è la mossa giusta.

  

Sono curioso di sapere se un modello di lua può fare questo

Da un punto di vista pratico, anche se un modello può fare questo, non si vuole. Da un punto di vista teorico, si sta cercando di trovare una doppia citazione che è preceduta da un numero pari di barre rovesciate. Questo è sicuramente un linguaggio regolare, e l'espressione regolare che si desidera sarebbe qualcosa come le (convenzioni Lua citando) a seguito

[[[^\](\\)*"(.-[^\](\\)*)"]]

E la stringa tra virgolette sarebbe risultato 2 #. Ma i modelli Lua sono non pieni espressioni regolari; in particolare, non si può mettere un * dopo un modello tra parentesi. Così La mia ipotesi è che questo problema non può essere risolto usando i modelli Lua, , ma dal momento che i modelli Lua non sono una cosa normale in automi teoria, io non sono a conoscenza di qualsiasi organismo di tecnica di prova che si potrebbe usare per provarlo.

Altri suggerimenti

Il problema con le citazioni sfuggito è che, in generale, se c'è un numero dispari di backslash prima della citazione, allora è sfuggito, e se c'è un numero pari, non lo è. Non credo che Lua pattern-matching è abbastanza potente per rappresentare questa condizione, quindi se avete bisogno di testo parse come questo, allora si dovrebbe cercare un altro modo. Forse si può scorrere la corda e analizzarlo, o si potrebbe trovare ogni citazione a sua volta e leggere a ritroso, contando i backslash fino a trovare un carattere non backslash (o l'inizio della stringa).

Se è assolutamente necessario utilizzare modelli per qualche motivo, si potrebbe provare a fare questo in un processo multi-step. In primo luogo, Gsub per tutte le occorrenze di due barre rovesciate in fila, e sostituirle con qualche valore sentinella. Questo deve essere un valore che non dispone già avviene nella stringa. Si potrebbe provare qualcosa di simile "\ 001" se si conosce questa stringa non contiene caratteri non stampabili. In ogni caso, una volta che hai sostituito tutte le sequenze di due barre rovesciate in una fila, le barre rovesciate sinistra sono sfuggire al carattere successivo. Ora è possibile applicare il modello originale, e poi finalmente è possibile sostituire tutte le istanze del valore del sentinella con due barre rovesciate di nuovo.

lingua modello di Lua è sufficiente per molti casi semplici. E ha almeno un trucco che non si trova in un tipico pacchetto di espressione regolare: un modo per abbinare parentesi equilibrata. Ma ha i suoi limiti.

Quando questi limiti vengono superati, quindi raggiungo LPeg . LPeg è un'implementazione di un'espressione Analisi Grammer per Lua, ed è stato realizzato da uno degli autori originali di Lua così l'adattamento a Lua è fatto abbastanza bene. Un PEG consente di specificare qualsiasi cosa, da modelli semplici attraverso grammatiche della lingua completi da scrivere. LPeg compila la grammatica ad un bytecode e lo esegue in modo estremamente efficiente.

si dovrebbe non tentare di analizzare HTML con le espressioni regolari, HTML e XML sono non linguaggi regolari e non può essere manipolato con successo con le espressioni regolari. È necessario utilizzare un parser HTML dedicato. Qui ci sono un sacco di spiegazioni perché .

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