5

文字列をよりきれいな方法で分割する方法がわかりません。

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

-15 は最初に、450 は最後に移動します。

価値を置くからいいじゃない。

適切な解決策は何ですか?

4

2 に答える 2

6

前もって警告: 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 のように"#"書かれた文字を使用することもできます。#"#"

于 2013-04-25T10:54:49.853 に答える
3

使用するアドバイス

set [ref rest2] parse line "#"  

あなたが望むものを与えません。
より良い使用

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

/all を使用しない解析は、csv 文字列を解析するための Rebol 表記または Rebol 表記を解析するための特殊なケースであるためです。
/all "#" を使用せずに、既に定義されている空白区切り文字などに追加するだけです。
これを取得します

== [「これ」「は」「foo」「そして」「ここ」「来る」「a」「長い」「バー」]

最初の 2 つの要素が ref と rest2 に割り当てられている

于 2013-06-20T19:12:33.233 に答える