Я отредактировал вопрос «ясности» и изменил его, чтобы сказать «был удален». Это звучало так, будто это было преднамеренное решение. Однако на самом деле это может быть просто не реализовано.
НО, если кто-нибудь спросит меня, я не думаю, что это должно быть в коробке ... и не только потому, что это паршивое использование слова «ВСЕ». Вот почему:
Вы ищете шаблоны в строках ... так что если вы ограничены использованием строки, чтобы указать этот шаблон, вы попадаете в «мета» проблемы. Предположим, я хочу извлечь слово *Rebol*
или ?Red?
, теперь должно быть ускользание, и все снова становится уродливым. Вернитесь в RegEx. : -/
Итак, что вы может на самом деле хотите не STRING! узор как s?r
, но БЛОК! рисунок как ["s" ? "r"]
. Это позволило бы построить такие конструкции, как ["?" ? "?"]
или [{?} ? {?}]
. Это лучше, чем перефразировать хакерство строк, которое использует каждый другой язык.
И это то, что делает PARSE, хотя и в слегка менее декларативном виде. Он также использует слова вместо символов, как любит Rebol. [{?} skip {?}]
является правилом совпадения, где skip
- это инструкция, которая перемещает позицию синтаксического анализа за любой элемент цикла анализа между вопросительными знаками. Он также мог бы сделать это, если бы он разбирал блок как входной сигнал и соответствовал бы [{?} 12-Dec-2012 {?}]
.
Я не знаю полностью, что поведение/ALL должно быть или должно быть с чем-то вроде «ab? C d e? * F» ... если он предоставил альтернативную логику шаблона или что. Я предполагаю, что реализация Rebol2 краткая? Вероятно, это соответствует только одному шаблону.
Чтобы установить базовый уровень, вот, возможно, хромой решение PARSE для s?r
намерения:
>> 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"
Если вы хотите, чтобы это было s*r
вы бы изменить skip "r" return pos
в to "r" return pos
.
В примечании об эффективности я упомянул, что на самом деле символы сопоставляются с символами быстрее, чем строки. Таким образом, to #"s"
и #"r" to end
делают измеримую разницу в скорости при анализе строк в целом. Помимо этого, я уверен, что другие могут сделать лучше.
Правило, безусловно, превышает "s?r"
. Но это не , что долго, когда комментарии вынимают:
[some [to #"s" pos: skip [skip #"r" return pos | none]] fail]
(Примечание: Это делает утечки поз:.? как написано Есть USE в PARSE, реализованы или планируются)
Однако приятная вещь в том, что он предлагает точки крючка во все моменты принятия решения, и без устранения дефектов имеет наивное строковое решение. (я соблазн дать свою обычную "Bad LEGO alligator vs. Good LEGO alligator" речь.)
Но если вы не хотите, чтобы закодировать в PARSE непосредственно, кажется, реальный ответ был бы какой-то "Glob Expression" -в-PARSE компилятором. Это может быть лучшей интерпретацией Glob Rebol бы, потому что вы могли бы сделать одноразовый:
>> parse "here is a string" glob "s?r"
== "string"
Или, если вы собираетесь делать матч часто кэшировать скомпилированные выражения. Кроме того, давайте представим себе форму блок использует слова грамотности:
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
Было бы интересно увидеть такой компилятор для регулярных выражений, а также. Они также могут принимать не только строку ввода, но и блокировать вход, так что оба "s.r"
и ["s" . "r"]
были легальными ... и если вы использовали форму блока вам не нужно бежать и мог бы написать ["." . "."]
, чтобы соответствовать ".A."
Довольно интересно все будет возможно. Учитывая, что в RegEx:
(abc|def)=\g{1}
matches abc=abc or def=def
but not abc=def or def=abc
Rebol может быть изменен, чтобы принять либо форму строки или скомпилировать в правило PARSE с формой, как:
regex [("abc" | "def") "=" (1)]
Тогда вы получите вариацию диалект, который не делает нужно ускользнуть. Проектирование и запись таких компиляторов остается в качестве упражнения для читателя. :-)
Относительно эффективности и PARSE, [«Какой самый быстрый/наиболее эффективный способ подсчета строк в Rebol] (http://stackoverflow.com/questions/14765993/whats-the-fastest-most-efficient-way- to-count-lines-in-rebol) может дать некоторые общие сведения. – HostileFork
Я думаю, у вас уже есть решение. Вы можете ответить на свои вопросы, и другие пользователи могут проголосовать за него. – sqlab
Для справки: подстановочные знаки не включены в словарное определение FIND для [Rebol 3] (http://www.rebol.com/r3/docs/functions/find.html) или [Rebol 2] (http://www.rebol.com/docs/words/ wfind.html), а также в [Основное руководство пользователя] (http://www.rebol.com/docs/core23/rebolcore-6.html#section-7.8). – rgchris