2013-04-25 14 views

Odpowiedz

5

Ostrzeżenie z góry: istnieje wiele różnych sposobów osiągnięcia tego w Rebol. Więc prawdopodobnie dostaniesz kilka różnych sugestii.

Na początek trzymajmy się oryginalnego podejścia do korzystania z funkcji ZNAJDŹ.

W przypadku korzystania z funkcji ZNAJDŹ z serią uzyskuje się nowy widok na podstawowe dane serii, które znajdują się w innym przesunięciu względem początku danych serii.

Zacznijmy jakiś przykład danych:

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

Przekonajmy charakter # w tej linii, oraz zapoznać się z wyniku, jak POS:

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

Jak widać, to w zasadzie już daje ci drugą część (to, co nazwałeś REST2) twojego podziału. Musisz tylko pominąć samego ogranicznika (i skopiuj wynikowy ciąg, aby niezależnie od pierwotnej linii String):

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

do wydobywania początkową część, można użyć miłą cechę COPY/part. Dokumentacja udoskonalenia "/ część" (spróbuj help copy) mówi: "Granice do danej długości lub pozycja" (podkreślenie moje). Mamy już taką pozycję jako POS. A więc:

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

I gotowe! Kompletny kod:

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

Dla porównania, tutaj jest podejście oparte PARSE:

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

dam to stanowisko bez dalszych wyjaśnień. Jeśli chcesz dowiedzieć się więcej o PARSE, dobrym miejscem do rozpoczęcia jest czcigodny "Parsing" chapter in the REBOL/Core Users Guide (pierwotnie napisany dla REBOL 2.3, ale podstawy są nadal w większości takie same w obecnych wersjach REBOL 2 i 3).

Jedna uwaga pomocnicza na końcu: zamiast pojedynczego łańcucha znaków "#" można również użyć znaku, który jest zapisany jako #"#" w Rebol.

+0

Bardzo ładne i podoba mi się podejście parse. Dzięki. –

+2

Jeśli wyszukiwany znak jest unikatowy w ciągu liniowym, możesz użyć krótszej formy do podziału ciągu i przypisania dwóch części w jednym wyrażeniu: 'set [ref rest2] parsowanie wiersza" # "' – DocKimbel

2

rada używać

set [ref rest2] parse line "#" 

nie da, czego pragniesz.
lepsze wykorzystanie

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

, jak parse bez/wszystko jest szczególnym przypadkiem w notacji REBOL do analizowania ciągów csv lub analizowania notacji REBOL.
bez/all „#” jest po prostu dodaje się do już zdefiniowanych białymi ogranicznikami kosmicznych itp
by dostać ten

== [ „to jest” „” „foo” „i” „tutaj” „pochodzi "" a "" długi "" pasek "]

z pierwszymi dwoma elementami przypisanymi do ref i rest2

Powiązane problemy