سؤال

حصلت على هذه السلسلة في نص لوا:

one;two;;three;four;;five;;six;seven;

لن يكون الشار الأول فصلاً فاصلاً. يمكن أن تكون الفواصل الوسطى فاصلة فاصلة واحدة أو مزدوجة ، ويمكن أن يكون آخر شار أو ليس فاصلة واحدة.

باستخدام أنماط لوا (و string.gsub()): كيف يمكنني مطابقة المنقصات المزدوجة في الوسط لاستبدالها بواحدة واحدة وحذف آخر فاصلة اختيارية؟

يجب أن يكون الإخراج هكذا:

one;two;three;four;five;six;seven

هل هذا ممكن باستخدام نمط واحد؟

هل كانت مفيدة؟

المحلول

باستخدام نمط واحد لاستبدال متعدد ; إلى واحد ;, وآخر لإزالة آخر ; مثل هذا

local str = "one;two;;three;four;;five;;six;seven;"
local result = str:gsub(';+', ';'):gsub(';*$', '')

إحدى الطرق الممكنة لاستخدام نمط واحد مثل هذا:

local result = (str .. ";;;"):gsub(";+", function(s) 
                                             if s == ";" or s == ";;" then 
                                                 return ";" 
                                             else 
                                                 return "" 
                                             end 
                                         end)

ما أحاول فعله هو إلحاق ثلاثة ; حتى نهاية السلسلة ، لذلك أي واحد أو اثنين ; يجب استبدال واحد ;. و اكثر ;(يمكن أن يكون ثلاثة أو أربعة ويجب أن يكون في النهاية) يتم استبداله بسلسلة فارغة.

أفضل الحل مع نمطين لأنه أكثر وضوحا.

نصائح أخرى

ماذا عن شيء مثل هذا:

function remove_extra_delim(s, delim)
    local t = {}
    for each in s:gmatch("[^"..delim.."]+") do
        table.insert(t, each)
    end
    return table.concat(t, delim)
end

teststr = "one;two;;three;four;;five;;six;seven;"
print(remove_extra_delim(teststr, ";"))

المخرجات:

واحد اثنان ثلاثة اربعة خمسة ستة سبعة

إذا كانت كمية المنقصين إما 1 أو 2 ، فيمكنك ببساطة القيام بذلك

string:gsub(";;", ";")

خلاف ذلك ، فإن الإجابات الأخرى ستفعل.

إنه مخترق قليلاً ، لكنه يفعل الحيلة:

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)

(ملاحظة: أنا أتابع وصفك بالضبط ، لذلك سوف تتطابق مع واحد أو اثنتين ؛ ولكن ليس أكثر من اثنين ، و Zero أو واحد نهائي ؛ ولكن ليس أكثر من واحد)

-- Method one uses two patterns but it's simpler and my preferred one
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)

-- Method two uses one pattern (if you really MUST use only one pattern)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top