miałem edytowano pytanie o "jasność" i zmieniono to na "usunięto". To sprawiło, że zabrzmiało to jak celowa decyzja. Jednak okazuje się, że nie zostało to zaimplementowane.
ALE jeśli ktoś mnie pyta, nie sądzę, że powinien być w pudełku ... i nie tylko dlatego, że jest kiepskim użyciem słowa "WSZYSTKO". Oto dlaczego:
Poszukujesz wzorów w ciągach ... więc jeśli jesteś zmuszony do używania ciągu znaków, aby określić ten wzór, dostaniesz się do problemów "meta". Powiedzmy, że chcę wydobyć słowo *Rebol*
lub ?Red?
, teraz musi być ucieczka i wszystko staje się brzydkie od nowa. Powrót do RegEx. : -/
To, co może może rzeczywiście chce nie jest STRING! wzór taki jak s?r
, ale BLOK! wzór taki jak ["s" ? "r"]
. Umożliwiłoby to konstruktom takim jak ["?" ? "?"]
lub . To lepsze niż ponowne użycie sznurka, którego używa każdy inny język.
I to właśnie robi PARSE, choć w nieco mniej deklaratywny sposób. Używa także słów zamiast symboli, jak lubi to Rebol. [{?} skip {?}]
jest regułą dopasowania, w której skip
jest instrukcją, która przesuwa pozycję analizy o dowolny element serii analizowania między znakami zapytania. Mogłoby to również zrobić, jeśli analizowałby blok jako dane wejściowe i pasowałoby do [{?} 12-Dec-2012 {?}]
.
Nie wiem do końca, jakie zachowanie/ALL powinno być lub powinno być z czymś takim jak "ab ?? c d e? * F" ... jeśli dostarczono alternatywną logikę wzoru lub co. Zakładam, że implementacja Rebol2 jest krótka? Prawdopodobnie pasuje tylko do jednego wzoru.
Aby ustawić punkt odniesienia, tutaj jest możliwe rozwiązanie PARSE-lame dla s?r
intencji:
>> parse "here is a string" [
some [ ; match rule repeatedly
to "s" ; advance to *before* "s"
pos: ; save position as potential match
skip ; now skip the "s"
[ ; [sub-rule]
skip ; ignore any single character (the "?")
"r" ; match the "r", and if we do...
return pos ; return the position we saved
| ; | (otherwise)
none ; no-op, keep trying to match
]
]
fail ; have PARSE return NONE
]
== "string"
Jeśli chciał go mieć s*r
byś zmienić skip "r" return pos
w to "r" return pos
.
W notatce dotyczącej efektywności wspomnę, że w rzeczywistości jest tak, że postacie są porównywane z postaciami szybszymi niż ciągi. Tak więc to #"s"
i #"r" to end
dają mierzalną różnicę w prędkości podczas ogólnego analizowania łańcuchów. Poza tym jestem pewien, że inni mogą robić lepiej.
Zasada jest z pewnością dłuższa niż "s?r"
. Ale to nie jest że długo gdy komentarze są wyjęte:
[some [to #"s" pos: skip [skip #"r" return pos | none]] fail]
(Uwaga: To nie wycieka poz.? jak napisane jest tam USE w zanalizować, realizowane lub planowane)
Jednak zaletą jest to, że oferuje punkty zaczepienia we wszystkich momentach decyzji, a bez uciekających wad ma naiwne rozwiązanie. (Kusi mnie, aby dać mój zwykły "Bad LEGO alligator vs. Good LEGO alligator" mowy.)
Ale jeśli nie chcesz, aby kod w analizowania bezpośrednio, wydaje się realna odpowiedź byłaby jakaś "Glob Expression" -to-analizowania kompilator. To może być najlepsza interpretacja glob REBOL musiałby, bo można zrobić jednorazowo:
>> parse "here is a string" glob "s?r"
== "string"
Lub jeśli masz zamiar robić meczu często cache skompilowany wyrażenie. Ponadto, wyobraźmy sobie nasz formularz blok używa słów do czytania:
s?r-rule: glob ["s" one "r"]
pos-1: parse "here is a string" s?r-rule
pos-2: parse "reuse compiled RegEx string" s?r-rule
To może być interesujące, aby taki kompilator regex również. Są również może zaakceptować nie tylko wejście ciąg ale także blokować wejście, dzięki czemu zarówno "s.r"
i ["s" . "r"]
były legalne ... i jeśli użyto formę bloku, który nie musiałby uciec i mógł napisać ["." . "."]
dopasować ".A."
Dość ciekawy wszystko byłoby możliwe. Biorąc pod uwagę, że w RegEx:
(abc|def)=\g{1}
matches abc=abc or def=def
but not abc=def or def=abc
REBOL może być zmodyfikowany tak, aby wziąć albo formę sznurka lub skompilować do reguły analizowania z postaci jak:
regex [("abc" | "def") "=" (1)]
Wtedy masz odmianę dialektu, który nie potrzebujesz ucieczki. Projektowanie i pisanie takich kompilatorów pozostawia się jako ćwiczenie dla czytelnika. :-)
Związany z wydajnością i PARSE, ["Jaki jest najszybszy/najbardziej efektywny sposób liczenia linii w Rebolu] (http://stackoverflow.com/questions/14765993/whats-the-fastest-most-efficient-way- to-count-lines-in-rebol) może dostarczyć ogólnych informacji: – HostileFork
Sądzę, że masz już rozwiązanie, możesz odpowiedzieć na własne pytania, a inni użytkownicy mogą na nie głosować: – sqlab
Dla odniesienia: symbole wieloznaczne nie są zawarte w słownikowa definicja FIND dla [Rebol 3] (http://www.rebol.com/r3/docs/functions/find.html) lub [Rebol 2] (http://www.rebol.com/docs/words/ wfind.html), a raczej w [Core User Manual] (http://www.rebol.com/docs/core23/rebolcore-6.html#section-7.8). – rgchris