كيف أقوم بتحويل سلسلة روبي ذات الأقواس إلى مصفوفة؟

StackOverflow https://stackoverflow.com/questions/38409

  •  09-06-2019
  •  | 
  •  

سؤال

أرغب في تحويل السلسلة التالية إلى صفيف/صفيف متداخل:

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

newarray = # this is what I need help with!

newarray.inspect  # => [['this','is'],['a','nested'],['array']]
هل كانت مفيدة؟

المحلول

سوف تحصل على ما تريد مع YAML.

ولكن هناك مشكلة صغيرة مع السلسلة الخاصة بك.تتوقع YAML وجود مسافة خلف الفاصلة.لذلك نحن بحاجة إلى هذا

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

شفرة:

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"]]

نصائح أخرى

من أجل الضحك:

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

تنصل:أنت بالتأكيد لا ينبغي أن تفعل هذا كما eval هي فكرة رهيبة، ولكنها سريعة ولها تأثير جانبي مفيد يتمثل في طرح استثناء إذا كانت صفائفك المتداخلة غير صالحة

يمكنك أيضًا التعامل معها على أنها JSON تقريبًا.إذا كانت السلاسل عبارة عن أحرف فقط، كما في مثالك، فسيعمل هذا:

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

إذا كان من الممكن أن تحتوي على أحرف عشوائية (بخلاف [ ] , ) فستحتاج إلى المزيد:

JSON.parse("[[this, is],[a, nested],[array]]".gsub(/, /,",").gsub(/([^\[\]\,]+)/,'"\1"'))

تبدو وكأنها مهمة تحليل أساسية.بشكل عام، النهج الذي تريد اتباعه هو إنشاء دالة عودية باستخدام الخوارزمية العامة التالية

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

الجزء الوحيد الصعب هنا هو تقسيم الإدخال على "،" واحد.يمكنك كتابة دالة منفصلة لهذا من شأنها إجراء مسح عبر السلسلة والاحتفاظ بعدد الأقواس المفتوحة - الأقواس المغلقة التي شوهدت حتى الآن.ثم قم بالتقسيم فقط بفواصل عندما يكون العدد مساويًا للصفر.

قم بإنشاء دالة متكررة تأخذ السلسلة وإزاحة عدد صحيح، و"تقرأ" مصفوفة.أي أنه يجب عليه إرجاع مصفوفة أو سلسلة (قرأها) وإزاحة عدد صحيح يشير بعد المصفوفة.على سبيل المثال:

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

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

ثم يمكنك استدعاؤها باستخدام دالة أخرى توفر إزاحة 0، وتتأكد من أن الإزاحة النهائية هي طول السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top