2016-02-04 3 views
1

У меня проблема с разбиением строки на две строки по специальному символу.Как разбить строку на указанный символ

Например:

12345#data 

или

1234567#data 

У меня 5-7 символов в первой части отделенной с "#" от второй части, где находятся еще данные (символы, цифры, не делает вопрос)

Мне нужно разделить и сохранить эти данные двумя переменными

x = 12345 
y = data 

без "#" знак.

Я искал функцию строки Lua как splitOn("#") или подстроку до символа, но я этого не нашел.

+6

@Wiktor Stribiżew Хотя они выглядят одинаково, Lua шаблон не регулярное выражение, пожалуйста, не добавляйте * регулярные выражения * тегов обратно. –

+2

Люди, которые регулярно, могут также знать шаблоны Lua, поэтому нет смысла удалять ярлык регулярных выражений. Добавление тега lua-patterns в порядке. –

+5

@ WiktorStribiżew Это не те теги, которые нужно делать. Я скажу это еще раз: ** Lua pattern не является регулярным выражением **. Вопрос с тегом regex * путал бы людей, что решение с использованием regex будет правильным ответом на этот вопрос, но это неверно. –

ответ

7

Использовать string.match и захватывает. Попробуйте это:

s = "12345#data" 
a,b = s:match("(.+)#(.+)") 
print(a,b) 
+0

Шаблон '(. +) # (. +)' Довольно неэффективен по сравнению с решением с отрицательным символьным классом. Поскольку '.' соответствует' # ', также есть много шагов возврата, которые не выполняются при использовании простого' [^ #] + ', который соответствует кускам, не проверяя, есть ли у нас' # ', backtrack, check, backtrack .... пока он не проверит всю вашу строку. Если регулярное выражение кажется «легким», это не значит, что оно эффективно. Кроме того, с группами захвата вы ограничены строкой только с двумя кусками, что относительно '12 # 34 # 56'? –

+0

@ WiktorStribiżew, все действительные баллы, спасибо. Выполнение шаблона, как в '^ (. +) # (. +) $, Помогает в производительности, хотя в этом примере это, вероятно, не имеет значения. – lhf

8

См this documentation:

Прежде всего, хотя Lua не имеет раздвоение функция является стандартной библиотекой, у него есть string.gmatch, который может быть использован вместо функции разделенной во многих случаях. В отличие от сплит-функции, string.gmatch берет образец, чтобы соответствовать тексту без разделителей, вместо того, чтобы разделители сами

Это легко достижимо с помощью инвертированный персонажа класса с string.gmatch:

local example = "12345#data" 
for i in string.gmatch(example, "[^#]+") do 
    print(i) 
end 

См IDEONE demo

[^#]+ шаблона соответствует один или более другим, чем # символов (это так, то «расколы» строку с 1 символом).

+0

Обратите внимание, что отрицательный класс символов формируется с помощью '[^', за которым следуют символы/сокращенные конструкции/классы символов POSIX и закрыты '' '. –

 Смежные вопросы

  • Нет связанных вопросов^_^