На красном языке, как разделить строку с помощью разделения, но также сохранить разделители как необходимые

Я хочу разделить строку с помощью split, при этом строка содержит строку, используемую в качестве разделителя, которую не следует рассматривать как разделитель. Я пробовал таким образом, как показано в следующем коде:

>> split {1 + 3 `to-string #"^(60)"`c} "`"
== ["1 + 3 " {to-string #"} {"} "c"] ;;I think it should be ["1 + 3 " {to-string #"^(60)"}"c"] 

to-string #"^(60)" используется здесь, чтобы избежать появления символа ``, который можно было бы назвать разделителем, но он не работает. Кажется, что ^(60) оценивается как ```, а затем используется в качестве разделителя split. Итак, каков механизм split на красном языке? И как разделить строку, сохраняя при этом те разделители, которые не следует рассматривать как разделитель.


red
person lyl    schedule 27.03.2021    source источник
comment
Если вы добавите тег к своему вопросу, который показывает, какой язык вы используете, вы, скорее всего, привлечете людей, которые могут помочь.   -  person A Haworth    schedule 27.03.2021
comment
Спасибо за напоминание. Я обновил свою проблему.   -  person lyl    schedule 27.03.2021
comment
Пример ожидаемой и фактически полученной строки ввода и вывода поможет.   -  person pippo1980    schedule 27.03.2021


Ответы (1)


^(60) — это так называемая форма кодовой точки, которая загружается как символ `.

>> "^(60)"
== "`"

Если вы хотите избежать этого, вы должны либо избежать его вручную:

>> {1 + 3 `to-string #"^^(60)"` c}
== {1 + 3 `to-string #"^^(60)"` c}

Или используйте необработанные строки:

>> %{1 + 3 `to-string #"^(60)"` c}%
== {1 + 3 `to-string #"^^(60)"` c}

splitопределить это потом тривиально:

>> split %{1 + 3 `to-string #"^(60)"` c}% #"`"
== ["1 + 3 " {to-string #"^^(60)"} " c"]

Если вы хотите оставить там символ `, то split его не вырежет. Вам нужно что-то вроде Parse:

>> string: {1 + 3 `to-string #"`"` c}
== {1 + 3 `to-string #"`"` c}
>> parse string [collect [keep to " `" " `" keep to "` " "` " keep copy match to end]]
== ["1 + 3" {to-string #"`"} "c"]
>> parse string [collect some [keep copy _ to copy match [" `" | "` " | end] match]]
== ["1 + 3" {to-string #"`"} "c"]
person 9214    schedule 27.03.2021
comment
@lyl ваш набор инструментов устарел, попробуйте получить последнюю версию, автоматическая сборка (не стабильная). Я не думаю, что необработанные строки нигде упоминаются (к сожалению, плохая документация - девиз Red); в основном это строка, которая не требует экранирования каких-либо специальных символов внутри нее, все они обрабатываются как есть в своей необработанной форме (отсюда и название). Синтаксис %...{...}...%, где число % с обеих сторон должно совпадать (в случае, если сама строка содержит символ %). - person 9214; 27.03.2021
comment
Большое спасибо. И я обновил свой последний комментарий. Не могли бы вы взглянуть на это? - person lyl; 27.03.2021
comment
Я скопировал ваш код %{1 + 3 to-string #"^(60)" c}% и запустил его, но получил неправильное сообщение *** Script Error: % operator is missing an argument. Почему? И где я могу найти подробное описание необработанных строк? Побег ^(60) с дополнительным ^, то есть ^^(60), тогда он не может вернуться к " as shown in this example: rejoin split {abc^^(60)d} ". Это даст abc^^(60)d, а не abc`d. Не могли бы вы помочь мне с этим? Спасибо. - person lyl; 27.03.2021
comment
@lyl, я обновил свой ответ. - person 9214; 27.03.2021