2013-04-25 25 views

Trả lời

5

Cảnh báo phía trước: có nhiều cách khác nhau để đạt được điều này trong Rebol. Vì vậy, bạn có thể sẽ nhận được một số gợi ý khác nhau.

Để bắt đầu, hãy chú ý đến phương pháp tiếp cận ban đầu của bạn khi sử dụng FIND.

Khi bạn sử dụng TÌM với một chuỗi, những gì bạn nhận được là chế độ xem mới vào dữ liệu chuỗi cơ sở, được đặt ở mức chênh lệch khác với phần bắt đầu của dữ liệu chuỗi.

Hãy bắt đầu với một số ví dụ dữ liệu:

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

Hãy TÌM nhân vật # trong dòng đó, và tham khảo kết quả như POS:

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

Như bạn có thể thấy, đây cơ bản đã cung cấp cho bạn phần thứ hai (những gì bạn gọi là REST2) của sự chia tách của bạn. Bạn sẽ chỉ phải bỏ qua quá khứ delimiter bản thân (và sau đó sao chép chuỗi kết quả, để làm cho nó độc lập với chuỗi dòng ban đầu):

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

Đối với giải nén phần đầu tiên, bạn có thể sử dụng một tính năng tốt đẹp của COPY/một phần. Tài liệu về tinh lọc "/ phần" (thử help copy) cho biết: "Giới hạn về độ dài cho trước hoặc vị trí" (nhấn mạnh mỏ). Chúng tôi đã có vị trí thuận tiện như POS. Vì vậy:

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

Và ở đó bạn đi! Các mã hoàn chỉnh:

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

Để tham khảo, đây là một cách tiếp cận phân tích dựa trên:

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

tôi sẽ cho đứng này mà không cần giải thích gì thêm. Nếu bạn muốn biết thêm thông tin về PARSE, một nơi tốt để bắt đầu là đáng tin cậy "Parsing" chapter in the REBOL/Core Users Guide (ban đầu được viết cho REBOL 2.3, nhưng những điều cơ bản vẫn hầu như giống nhau trong các phiên bản REBOL 2 và 3 hiện tại).

Một lưu ý phụ trợ ở cuối: thay vì chuỗi một mục "#" bạn cũng có thể sử dụng ký tự được viết là #"#" trong Rebol.

+0

Rất đẹp và tôi thích cách phân tích cú pháp. Cảm ơn. –

+2

Nếu ký tự tìm kiếm của bạn là duy nhất trong chuỗi ký tự, bạn có thể sử dụng biểu mẫu ngắn hơn để tách chuỗi và gán hai phần trong một biểu thức: 'set [ref rest2] parse line" # "' – DocKimbel

2

những lời khuyên để sử dụng

set [ref rest2] parse line "#" 

sẽ không từ bỏ những gì bạn mong muốn.
tốt hơn sử dụng

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

, như phân tích mà không/tất cả là một trường hợp đặc biệt trong ký hiệu Rebol cho phân tích chuỗi csv hoặc cho phân tích cú pháp ký hiệu Rebol.
mà không/all "#" là chỉ cần thêm vào delimiters khoảng trắng đã được xác định, vv
Bạn sẽ có được điều này

== [ "này" "là" "foo" "và" "ở đây" "xuất phát "" "" "" "" "thanh"]

với hai thành phần đầu tiên được gán cho ref và rest2

Các vấn đề liên quan