2008-09-01 40 views

Trả lời

11

Bạn sẽ nhận được những gì bạn muốn với YAML.

Nhưng có một vấn đề nhỏ với chuỗi của bạn. YAML hy vọng rằng có một khoảng trống phía sau dấu phẩy. Vì vậy, chúng ta cần điều này

str = "[[this, is], [a, nested], [array]]" 

Code:

require 'yaml' 
str = "[[this, is],[a, nested],[array]]" 
### transform your string in a valid YAML-String 
str.gsub!(/(\,)(\S)/, "\\1 \\2") 
YAML::load(str) 
# => [["this", "is"], ["a", "nested"], ["array"]] 
+0

Cảm ơn bạn rất nhiều vì điều này! Tôi sắp điên rồ cố gắng tìm ra điều này. :) – CalebHC

+0

+1 cho việc sử dụng thông minh thư viện và regex hiện có – BF4

0

Trông giống như một nhiệm vụ phân tích cơ bản. Nói chung cách tiếp cận bạn sẽ muốn thực hiện là tạo một hàm đệ quy với các thuật toán chung sau

base case (input doesn't begin with '[') return the input 
recursive case: 
    split the input on ',' (you will need to find commas only at this level) 
    for each sub string call this method again with the sub string 
    return array containing the results from this recursive method 

Các chỉ là một phần slighlty khó hiểu ở đây là tách các đầu vào trên một đơn ''. Bạn có thể viết một chức năng riêng biệt cho điều này sẽ quét qua chuỗi và giữ một số các openbrackets - closedbrakets nhìn thấy cho đến nay. Sau đó, chỉ chia trên dấu phẩy khi số đếm bằng 0.

0

Tạo hàm đệ quy lấy chuỗi và số nguyên, và "đọc" ra một mảng. Nghĩa là, có nó trả về một mảng hoặc chuỗi (mà nó đã đọc) và một dấu chỉ số nguyên chỉ sau mảng. Ví dụ:

s = "[[this, is],[a, nested],[array]]" 

yourFunc(s, 1) # returns ['this', 'is'] and 11. 
yourFunc(s, 2) # returns 'this' and 6. 

Sau đó, bạn có thể gọi nó bằng hàm khác có độ lệch là 0 và đảm bảo rằng độ lệch hoàn thiện là độ dài của chuỗi.

3

Đối với một nụ cười:

ary = eval("[[this, is],[a, nested],[array]]".gsub(/(\w+?)/, "'\\1'")) 
=> [["this", "is"], ["a", "nested"], ["array"]] 

Disclaimer: Bạn chắc chắn không nên làm điều này như eval là một ý tưởng khủng khiếp, nhưng nó là nhanh chóng và có tác dụng phụ hữu ích của ném một ngoại lệ nếu mảng lồng nhau của bạn aren 't hợp lệ

3

Bạn cũng có thể đối xử với nó như hầu-JSON. Nếu chuỗi thực sự chỉ có chữ cái, như trong ví dụ của bạn, thì điều này sẽ làm việc:

JSON.parse(yourarray.gsub(/([a-z]+)/,'"\1"')) 

Nếu họ có thể có ký tự tùy ý (trừ []), bạn sẽ cần nhiều hơn một chút:

JSON.parse("[[this, is],[a, nested],[array]]".gsub(/, /,",").gsub(/([^\[\]\,]+)/,'"\1"')) 
Các vấn đề liên quan