Как сопоставить часть строки перед символом с одной переменной, а все после нее с другой

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

Например:

12345#data

or

1234567#data

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

Мне нужно хранить две части с каждой стороны # в двух переменных:

x = 12345
y = data 

без символа "#".

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


person Marek    schedule 04.02.2016    source источник
comment
@Wiktor Stribiżew Хотя они выглядят похожими, шаблон Lua не является регулярным выражением, пожалуйста, не добавляйте тег regex обратно.   -  person Yu Hao    schedule 04.02.2016
comment
Люди, использующие регулярное выражение, также могут знать шаблоны Lua, поэтому нет смысла удалять тег регулярного выражения. Добавление тега lua-patterns — это нормально.   -  person Wiktor Stribiżew    schedule 05.02.2016
comment
@WiktorStribiżew Это не то, что должны делать теги. Повторю еще раз: Шаблон Lua не является регулярным выражением. Вопрос с тегом regex сбил бы людей с толку тем, что решение, использующее регулярное выражение, будет правильным ответом на этот вопрос, но это не так.   -  person Yu Hao    schedule 05.02.2016
comment
О, так мы должны начать думать о тегах для JS-regex, Python-regex, net-regex...? Посмотрите на Vim, это regex? Но все вопросы помечены регулярным выражением. Кроме того, регулярные выражения больше не являются регулярными. И когда . означает соответствие любому символу, который уже является регулярным выражением, а не подстановочным знаком. Просто другой вкус. Кроме того, вы не последовательны тогда. Почему бы не удалить тег regex из всех вопросов Lua с просьбой о помощи с regex?   -  person Wiktor Stribiżew    schedule 05.02.2016
comment
@WiktorStribiżew Нет, я сказал не это, и у вас явно нет полного понимания шаблонов Lua, пожалуйста, прочитайте PiL. Сопоставление шаблонов Lua не является расширением регулярного выражения, как регулярное выражение в других языках/инструментах. В качестве простого примера попробуйте print(string.match("ababab","(ab)+")) в Lua, это не работает так, как вы могли бы ожидать, например, результат в Ruby.   -  person Yu Hao    schedule 06.02.2016
comment
Война отката по этому вопросу обсуждается здесь на мета.   -  person Daedalus    schedule 06.02.2016
comment
К сожалению, этот пост вызвал такую ​​бурю вокруг тега, хотя на самом деле это просто нехороший, хорошо изученный вопрос, и его следует закрыть. Этот поиск оказался первым результатом подробного обсуждения различных методов разделения строк в Lua. . В этом вопросе нет ничего, что предполагало бы, что ОП нужно что-то большее.   -  person Peter Duniho    schedule 06.02.2016


Ответы (2)


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

s = "12345#data"
a,b = s:match("(.+)#(.+)")
print(a,b)
person lhf    schedule 04.02.2016
comment
Шаблон (.+)#(.+) довольно неэффективен по сравнению с решением класса символов с отрицательным знаком. Поскольку . также соответствует #, существует множество шагов возврата, которые не выполняются при использовании простого [^#]+, который соответствует частям без проверки, есть ли у нас #, возврат, проверка, возврат.... пока он не проверит всю вашу строку. . Если регулярное выражение кажется простым, это не значит, что оно эффективно. Кроме того, при захвате групп вы ограничены строкой, состоящей всего из 2 фрагментов, а как насчет 12#34#56? - person Wiktor Stribiżew; 04.02.2016
comment
@WiktorStribiżew, все верно, спасибо. Привязка шаблона, как в ^(.+)#(.+)$, сильно повышает производительность, хотя в данном примере это, вероятно, не имеет значения. - person lhf; 06.02.2016

См. эту документацию:

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

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

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

См. демонстрацию IDEONE.

Шаблон [^#]+ соответствует одному или нескольким символам, отличным от # (таким образом, он "разбивает" строку с 1 символом).

person Wiktor Stribiżew    schedule 04.02.2016
comment
Обратите внимание, что отрицательный класс символов формируется с помощью [^, за которым следуют символы/сокращенные конструкции/классы символов POSIX и закрывается с помощью ]. - person Wiktor Stribiżew; 04.02.2016