2013-04-25 1 views
5

Я не понял, как разделить строку более чистым способом.Как разбить строку на конкретный символ в Rebol

ref: copy/part (find line "#") -15 
rest2: copy/part (skip (find line "#") 1) 450 

-15 предназначен для начала и 450 дней до конца.

Это не приятно, потому что я положил значение.

Какое правильное решение?

ответ

5

Предупреждение спереди: есть много разных способов достижения этого в Реболе. Поэтому вы, вероятно, получите несколько разных предложений.

Для начала давайте придерживаться вашего первоначального подхода к использованию FIND.

Когда вы используете FIND с серией, то, что вы получаете, представляет собой новый вид на данные базовой серии, расположенные на другом смещении от начала данных серии.

Давайте начнем с некоторым примером данными:

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

Найдёх # характера в этой строке, и относится к результату, как POS:

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

Как вы можете видеть, это в основном уже дает вам вторую часть (то, что вы назвали REST2) вашего раскола. Вы только должны пропустить мимо самого разделителя (а затем скопировать полученную строку, чтобы сделать его независимым от исходной строки ЛИНИИ):

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

Для извлечения начальной части, вы можете использовать хороший признак COPY/часть. Документация «/ part» уточнения (попробуйте help copy) говорит: «Пределы до заданной длины или позиция» (акцент мой). У нас уже есть эта позиция, удобная как POS. Таким образом:

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

И вот вы! Полный код:

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

Для справки, вот PARSE подход, основанный на:

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

Я дам эту позицию без дальнейших объяснений. Если вы хотите узнать больше о PARSE, хорошим местом для начала является почтенный "Parsing" chapter in the REBOL/Core Users Guide (первоначально написанный для REBOL 2.3, но основы по-прежнему в основном идентичны в текущих версиях REBOL 2 и 3).

Один подсобного примечание в конце: вместо строки одного элемента "#" вы также можете использовать символ, который записывается в виде #"#" в Rebol.

+0

Очень хороший, и мне нравится подход синтаксического анализа. Благодарю. –

+2

Если ваш искомый символ уникален в строке строки, вы можете использовать более короткую форму для разделения строки и назначения двух частей в одном выражении: 'set [ref rest2] parse line" # "' – DocKimbel

2

совет использовать

set [ref rest2] parse line "#" 

не даст то, что вы желаете.
лучше использовать

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

как разборе без/все это особый случай в Rebol нотации для разбора CSV строк или для разбора Rebol обозначения.
без/все «#» просто добавляется к уже определенных пробельных разделителей и т.д.
Вы получите этот

== [ «это» «является» «Foo» «и» «здесь» «приходит "„а“„длинный“„бар“]

с первыми двумя элементами, присвоенных исх и rest2