Прочитайте две строки с помощью io.read () и примените их к таблицам [duplicate]

Версия jQuery:

var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

Работает из jQuery 1.6

https://api.jquery.com/scrollTop/

http://api.jquery.com/prop/

133
задан dda 22 March 2016 в 18:03
поделиться

13 ответов

См. Разделительные строки :

Здесь представлены различные способы разбиения строки на список подстрок, разбивая исходную строку на вхождениях какого-либо разделителя (символ , набор символов или шаблон). Обычно это называется функцией разделения строк [2].

77
ответ дан Andrew Hare 19 August 2018 в 07:55
поделиться
  • 1
    К сожалению, страница была отредактирована с тех пор (хотя она находится на той же теме), и прохождение, которое вы цитировали, не встречается на странице. Вот почему это идеальное решение, чтобы избежать ответов только на ссылки и фактически включать соответствующую информацию в сам ответ. – ShreevatsaR 26 January 2018 в 00:56

Вот функция:

function split(pString, pPattern)
   local Table = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pPattern
   local last_end = 1
   local s, e, cap = pString:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
     table.insert(Table,cap)
      end
      last_end = e+1
      s, e, cap = pString:find(fpat, last_end)
   end
   if last_end <= #pString then
      cap = pString:sub(last_end)
      table.insert(Table, cap)
   end
   return Table
end

Вызвать это так:

list=split(string_to_split,pattern_to_match)

например:

list=split("1:2:3:4","\:")

Подробнее здесь: http://lua-users.org/wiki/SplitJoin

10
ответ дан Andrew White 19 August 2018 в 07:55
поделиться

Поскольку у кошки есть более одного способа кошки, вот мой подход:

Код:

#!/usr/bin/env lua

local content = [=[
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat.
]=]

local function split(str, sep)
   local result = {}
   local regex = ("([^%s]+)"):format(sep)
   for each in str:gmatch(regex) do
      table.insert(result, each)
   end
   return result
end

local lines = split(content, "\n")
for _,line in ipairs(lines) do
   print(line)
end

Выход: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Объяснение:

Функция gmatch работает как итератор, она извлекает все строки, соответствующие regex. regex принимает все символы, пока не найдет разделитель.

5
ответ дан Diego Pino 19 August 2018 в 07:55
поделиться

Если вы разделяете строку в Lua, вы должны попробовать методы string.gmatch () или string.sub (). Используйте метод string.sub (), если вам известен индекс, который вы хотите разбить на строку, или используйте string.gmatch (), если вы проанализируете строку, чтобы найти местоположение для разделения строки на.

Пример использования string.gmatch () из Справочное руководство Lua 5.1 :

 t = {}
 s = "from=world, to=Lua"
 for k, v in string.gmatch(s, "(%w+)=(%w+)") do
   t[k] = v
 end
27
ответ дан gwell 19 August 2018 в 07:55
поделиться
  • 1
    I & quot; заимствованный & quot; реализация из этой страницы lua-users в любом случае – RCIX 15 September 2009 в 17:56

Если вы просто хотите перебирать токены, это довольно аккуратно:

line = "one, two and 3!"

for token in string.gmatch(line, "[^%s]+") do
   print(token)
end

Выход:

one,

two

и

3!

Краткое объяснение: шаблон «[^% s] +» соответствует каждой непустой строке между пробельные символы.

22
ответ дан Hugo 19 August 2018 в 07:55
поделиться
  • 1
    Образец %S равен тому, который вы упомянули, поскольку %S является отрицанием %s, например %D является отрицанием %d. Кроме того, %w равно [A-Za-z0-9_] (другие символы могут поддерживаться в зависимости от вашего локали). – Lars Gyrup Brink Nielsen 3 January 2014 в 00:00

Я использовал приведенные выше примеры для создания собственной функции. Но недостающая часть для меня автоматически ускользала от магических символов.

Вот мой вклад:

function split(text, delim)
    -- returns an array of fields based on text and delimiter (one character only)
    local result = {}
    local magic = "().%+-*?[]^$"

    if delim == nil then
        delim = "%s"
    elseif string.find(delim, magic, 1, true) then
        -- escape magic
        delim = "%"..delim
    end

    local pattern = "[^"..delim.."]+"
    for w in string.gmatch(text, pattern) do
        table.insert(result, w)
    end
    return result
end
1
ответ дан intrepidhero 19 August 2018 в 07:55
поделиться
  • 1
    Это была моя большая проблема. Это отлично работает с волшебными персонажами, красивыми – Andrew White 3 June 2016 в 06:08

Мне нравится это короткое решение

function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end
6
ответ дан Ivo Beckers 19 August 2018 в 07:55
поделиться
  • 1
    Это мой любимый, так как он такой короткий и простой. Я не совсем понимаю, что происходит, может кто-нибудь объяснить мне? – hexagonest 24 November 2013 в 06:04
  • 2
    Это не удается при использовании точки в качестве разделителя (или, возможно, любого другого волшебного символа шаблона) – TurboHz 16 April 2014 в 12:39

Многие из этих ответов допускают только односимвольные разделители или не имеют дело с краевыми случаями (например, пустые разделители), поэтому я думал, что я дам более окончательное решение.

две функции, gsplit и split, адаптированные из кода в расширении Scribunto MediaWiki , который используется на вики, например, в Википедии. Код лицензируется в соответствии с GPL v2 . Я изменил имена переменных и добавил комментарии, чтобы сделать код немного понятным, и я также изменил код, чтобы использовать обычные строковые шаблоны Lua вместо шаблонов Scribunto для строк Unicode.

-- gsplit: iterate over substrings in a string separated by a pattern
-- 
-- Parameters:
-- text (string)    - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean)  - if true (or truthy), pattern is interpreted as a plain
--                    string, not a Lua pattern
-- 
-- Returns: iterator
--
-- Usage:
-- for substr in gsplit(text, pattern, plain) do
--   doSomething(substr)
-- end
local function gsplit(text, pattern, plain)
  local splitStart, length = 1, #text
  return function ()
    if splitStart then
      local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
      local ret
      if not sepStart then
        ret = string.sub(text, splitStart)
        splitStart = nil
      elseif sepEnd < sepStart then
        -- Empty separator!
        ret = string.sub(text, splitStart, sepStart)
        if sepStart < length then
          splitStart = sepStart + 1
        else
          splitStart = nil
        end
      else
        ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
        splitStart = sepEnd + 1
      end
      return ret
    end
  end
end

-- split: split a string into substrings separated by a pattern.
-- 
-- Parameters:
-- text (string)    - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean)  - if true (or truthy), pattern is interpreted as a plain
--                    string, not a Lua pattern
-- 
-- Returns: table (a sequence table containing the substrings)
local function split(text, pattern, plain)
  local ret = {}
  for match in gsplit(text, pattern, plain) do
    table.insert(ret, match)
  end
  return ret
end

Некоторые примеры используемой функции split:

local function printSequence(t)
  print(unpack(t))
end

printSequence(split('foo, bar,baz', ',%s*'))       -- foo     bar     baz
printSequence(split('foo, bar,baz', ',%s*', true)) -- foo, bar,baz
printSequence(split('foo', ''))                    -- f       o       o
0
ответ дан Jack Taylor 19 August 2018 в 07:55
поделиться

Вы можете использовать этот метод:

function string:split(delimiter)
  local result = { }
  local from  = 1
  local delim_from, delim_to = string.find( self, delimiter, from  )
  while delim_from do
    table.insert( result, string.sub( self, from , delim_from-1 ) )
    from  = delim_to + 1
    delim_from, delim_to = string.find( self, delimiter, from  )
  end
  table.insert( result, string.sub( self, from  ) )
  return result
end

delimiter = string.split(stringtodelimite,pattern) 
4
ответ дан Jason Plank 19 August 2018 в 07:55
поделиться

Просто сидит на разделителе

local str = 'one,two'
local regxEverythingExceptComma = '([^,]+)'
for x in string.gmatch(str, regxEverythingExceptComma) do
    print(x)
end
2
ответ дан Jerome Anthony 19 August 2018 в 07:55
поделиться

Так же, как string.gmatch найдет шаблоны в строке, эта функция найдет вещи между шаблонами :

function string:split(pat)
  pat = pat or '%s+'
  local st, g = 1, self:gmatch("()("..pat..")")
  local function getter(segs, seps, sep, cap1, ...)
    st = sep and seps + #sep
    return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
  end
  return function() if st then return getter(st, g()) end end
end

По умолчанию он возвращает все, что разделено пробелами.

14
ответ дан Norman Ramsey 19 August 2018 в 07:55
поделиться
  • 1
    +1. Обратите внимание на других начинающих Lua: это возвращает итератор, а «между шаблонами» включает начало и конец строки. (Как новичок, я должен был попытаться понять это.) – Darius Bacon 12 July 2010 в 00:26

Вот мое действительно простое решение. Используйте функцию gmatch для захвата строк, которые содержат по крайней мере один символ НИЧЕГО, кроме желаемого разделителя. По умолчанию разделителем является ЛЮБАЯ пробел (% s в Lua):

function mysplit(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end
68
ответ дан SuperFastNinja 19 August 2018 в 07:55
поделиться
  • 1
    Благодарю. Просто , что я искал. – Nicholas 3 June 2012 в 20:33
  • 2
    Вау, первый ответ во всем этом вопросе, который фактически имеет функцию, возвращающую таблицу. Обратите внимание, однако, что t и i нужны "локальные" модификатор, так как это вы переписываете глобальные переменные. :) – cib 18 April 2013 в 19:05
  • 3
    Это сработало. Это просто для одиночных разделителей символов. Чтобы разбить по строкам, например тегам XML, изменить шаблон соответствия на & quot; (.-) (& quot; .. sep .. & quot;) & quot; вместо. Примечание. Если строка заканчивается на sep, последнее совпадение не будет выполнено. Чтобы исправить это, добавьте новую строку или любой символ в конец строки ввода. – Henrik Erlandsson 30 July 2014 в 10:17
  • 4
    Как указывали другие, вы можете упростить это, используя table.insert (t, str) вместо t [i] = str, а затем вам не нужно i = 1 или i = i +1 – James Newton 21 April 2015 в 00:27
  • 5
    Не работает, если строка содержит пустые значения, например. 'foo,,bar'. Вы получаете {'foo','bar'} вместо {'foo', '', 'bar'} – andras 19 September 2016 в 21:38
1
ответ дан Hohenheim 30 October 2018 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: