Вопрос по replace – Как убрать пробелы из строки в Lua?

14

Я хочу удалить все пробелы из строки в Lua. Вот что я попробовал:

string.gsub(str, "", "")
string.gsub(str, "% ", "")
string.gsub(str, "%s*", "")

Это не похоже на работу. Как я могу удалить все пробелы?

Ваш Ответ

4   ответа
1

возможно, родного C / C ++) были ужасно медленными в моих тестах. Эта реализация показала лучшую производительность:

function trim (str)
  if str == '' then
    return str
  else  
    local startPos = 1
    local endPos   = #str

    while (startPos < endPos and str:byte(startPos) <= 32) do
      startPos = startPos + 1
    end

    if startPos >= endPos then
      return ''
    else
      while (endPos > 0 and str:byte(endPos) <= 32) do
        endPos = endPos - 1
      end

      return str:sub(startPos, endPos)
    end
  end
end -- .function trim
4

скомпилированный из trim.c:

/* trim.c - based on http://lua-users.org/lists/lua-l/2009-12/msg00951.html
            from Sean Conner */
#include <stddef.h>
#include <ctype.h>
#include <lua.h>
#include <lauxlib.h>

int trim(lua_State *L)
{
 const char *front;
 const char *end;
 size_t      size;

 front = luaL_checklstring(L,1,&size);
 end   = &front[size - 1];

 for ( ; size && isspace(*front) ; size-- , front++)
   ;
 for ( ; size && isspace(*end) ; size-- , end--)
   ;

 lua_pushlstring(L,front,(size_t)(end - front) + 1);
 return 1;
}

int luaopen_trim(lua_State *L)
{
 lua_register(L,"trim",trim);
 return 0;
}

скомпилировать что-то вроде:

gcc -shared -fpic -O -I/usr/local/include/luajit-2.1 trim.c -o trim.so

Более подробно (по сравнению с другими методами):http://lua-users.org/wiki/StringTrim

Usage:

local trim15 = require("trim")--at begin of the file
local tr = trim("   a z z z z z    ")--anywhere at code
30

вам просто нужно присвоить фактический результат / возвращаемое значение. Используйте один из следующих вариантов:

str = str:gsub("%s+", "")
str = string.gsub(str, "%s+", "")

я использую%s+ поскольку нет смысла заменять пустое совпадение (то есть нет пробела). Это просто не имеет никакого смысла, поэтому я ищу хотя бы один пробел (используя+ квантор).

Конечный результат будет таким же, но с+ Вы замените пробелы, следующие друг за другом, за один раз, что может быть более производительным (не совсем уверен, действительно ли это имеет значение в Lua).
Вы действительно не должны использовать +, он не будет соответствовать не пробелу, если вы просто используете% s. Использование% s кажется более распространенным - хотя я думаю, что конечный результат тот же.
Я тоже. Просто стоит упомянуть.
1

function all_trim(s)
  return s:match"^%s*(.*)":match"(.-)%s*$"
end

Или короче:

function all_trim(s)
   return s:match( "^%s*(.-)%s*$" )
end

использование:

str=" aa " 
print(all_trim(str) .. "e")

Выход:

aae
Код, который я дал, работает и никогда не производитnil как результат для любой входной строки. Вы вернули результат? Или вы забыли цитаты вокруг"e"?
Или даже короче и за один раз:s:match( "^%s*(.-)%s*$" ).
Хорошо, вот полный код для копирования / вставки:function all_trim(s) return s:match( "^%s*(.-)%s*$" ) end; str = " aa "; print( all_trim( str ) .. "e" ), И это прекрасно работает здесь.
Мой код работает хорошо. И я справляюсь / вставляю, не забывай
Я использовал ваше предложение, но я получилstdin:1: attempt to concatenate a nil value

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