文字列をよりきれいな方法で分割する方法がわかりません。
ref: copy/part (find line "#") -15
rest2: copy/part (skip (find line "#") 1) 450
-15 は最初に、450 は最後に移動します。
価値を置くからいいじゃない。
適切な解決策は何ですか?
文字列をよりきれいな方法で分割する方法がわかりません。
ref: copy/part (find line "#") -15
rest2: copy/part (skip (find line "#") 1) 450
-15 は最初に、450 は最後に移動します。
価値を置くからいいじゃない。
適切な解決策は何ですか?
前もって警告: Rebol でこれを実現するには、さまざまな方法があります。したがって、おそらくかなりの数の異なる提案が得られるでしょう。
まず、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"
ご覧のとおり、これで基本的に、分割の 2 番目の部分 (REST2 と呼ばれるもの) が既に提供されています。区切り文字自体をスキップするだけです (そして、結果の文字列をコピーして、元の LINE 文字列から独立させます)。
>> rest: copy next pos
== "and here comes a long bar"
最初の部分を抽出するには、COPY/part の優れた機能を使用できます。"/part" 改良 ( try 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 についてもっと知りたい場合は、REBOL/Core ユーザーズガイドの由緒ある「解析」の章から始めるのが良いでしょう(元々は REBOL 2.3 用に書かれていますが、現在の REBOL 2 および 3 バージョンでも基本はほとんど同じです。 )。
最後に 1 つの補足的な注意: 単一項目の文字列の代わりに、Rebol のように"#"
書かれた文字を使用することもできます。#"#"
使用するアドバイス
set [ref rest2] parse line "#"
あなたが望むものを与えません。
より良い使用
set [ref rest2] parse/all line "#"
/all を使用しない解析は、csv 文字列を解析するための Rebol 表記または Rebol 表記を解析するための特殊なケースであるためです。
/all "#" を使用せずに、既に定義されている空白区切り文字などに追加するだけです。
これを取得します
== [「これ」「は」「foo」「そして」「ここ」「来る」「a」「長い」「バー」]
最初の 2 つの要素が ref と rest2 に割り当てられている