2013-04-25 15 views

risposta

5

Un avviso in primo piano: ci sono molti modi per ottenere questo risultato in Rebol. Quindi probabilmente riceverai parecchi suggerimenti diversi.

Per iniziare, attenersi all'approccio originale dell'utilizzo di TROVA.

Quando si utilizza TROVA con una serie, si ottiene una nuova vista sui dati di serie sottostanti, posizionati su un offset diverso dall'inizio dei dati della serie.

Cominciamo con alcuni dati esempio:

>> line: copy "this is foo#and here comes a long bar" 
== "this is foo#and here comes a long bar" 

Troviamo il carattere # all'interno di quella linea, e si riferiscono al risultato come POS:

>> pos: find line "#" 
== "#and here comes a long bar" 

Come si può vedere, questo in sostanza già ti dà la seconda parte (ciò che hai chiamato REST2) della tua divisione. Dovrete solo per saltare oltre il delimitatore stesso (e quindi copiare la stringa risultante, per renderlo indipendente dalla stringa linea originale):

>> rest: copy next pos 
== "and here comes a long bar" 

Per estrarre la parte iniziale, è possibile utilizzare una bella caratteristica di COPIA/parte. La documentazione del perfezionamento "/ parte" (prova help copy) dice: "Limiti a una determinata lunghezza o posizione" (sottolineatura mia). Abbiamo già questa posizione a portata di mano come POS. Quindi:

>> ref: copy/part line pos 
== "this is foo" 

Ed ecco fatto! Il codice completo:

pos: find line "#" 
ref: copy/part line pos 
rest: copy next pos 

Per riferimento, ecco un approccio PARSE-based:

parse line [copy ref to "#" skip copy rest to end] 

ti lascio questa posizione, senza ulteriori spiegazioni. Se vuoi saperne di più su PARSE, un buon punto di partenza è il venerabile "Parsing" chapter in the REBOL/Core Users Guide (originariamente scritto per REBOL 2.3, ma le basi sono ancora le stesse nelle attuali versioni di REBOL 2 e 3).

Una nota accessoria alla fine: invece di una stringa di un unico elemento "#" si potrebbe anche utilizzare un carattere che è scritto come #"#" in Rebol.

+0

molto bello e mi piace l'approccio di analisi. Grazie. –

+2

Se il carattere cercato è univoco nella stringa di riga, è possibile utilizzare un modulo più breve per dividere la stringa e assegnare le due parti in un'unica espressione: 'set [ref rest2] analizza linea" # "' – DocKimbel

2

il consiglio di usare

set [ref rest2] parse line "#" 

non darà ciò che desideri.
migliore utilizzo

set [ref rest2] parse/all line "#" 

, come parse senza/tutto è un caso speciale in Rebol notazione per l'analisi di stringhe CSV o per l'analisi Rebol notazione.
senza/all "#" è appena aggiunto allo spazio delimitatori bianchi già definite ecc
Si potrebbe ottenere questo

== [ "questo" "è" "pippo" "e" "qui" "deriva " 'a' 'lungo' 'bar']

con i primi due elementi assegnati a ref e periodo di riposo.2

Problemi correlati