Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Создание массивов из текста

#php #регулярные_выражения #lua #match


У меня например есть строка

s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"


Мне нужно разделить с помощью выражений, а именно функцией string.gmatch, на массив
который будет вмещать в себе масивы с цвета R, G, B и самой строки. То есть чтобы в
результате я получил массив:

arr[1] = {0, 0, 0, "Hello, world! "}
// Из-за того что в начале строки нет кода цвета, то по умолчанию ставить цвет по нулям

arr[2] = {255, 0, 0, "Привет, мир! "}

arr[3] = {155, 55, 0, "How are {100,3,5you?"}
// "How are {100,3,5you?" - именно так, по скольку неправильно сформирован код цвета,
также если будет например буква внутри {100,3Я,5}, то это также все пойдет в строку


Вот что у меня получилось написать на LUA:

arr = {}
s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"
for k, v in string.gmatch(s, "{(%d+,%d+,%d+)}([^{]*)") do
    local r, g, b = string.match(k, "(%d+),(%d+),(%d+)")
    table.insert(arr, {r, g, b, v})
end


В результате получаю массив:

arr[1] = {255, 0, 0, "Привет, мир! "}
arr[2] = {155, 55, 0, "How are "}


Но меня это не устраивает:

1) нет части строки, в которой не указан цвет, то есть нет массива 
arr[1] = {0, 0, 0, "Hello, world! "}

2) Обрезает до следующего символа {, а нужно чтобы обрезало до комбинации цвета

Как по-другому это реализовать (но в простом варианте, то есть так, чтобы не было
большой нагрузки), или хотя бы как например такое реализовать в PHP, а я бы попытался
уже как-то перевести на LUA
    


Ответы

Ответ 1



Может кто-то знает как по другому это реализовать (но в простом варианте, тоесть так чтобы не было большой нагрузки), или хотя бы как например такое реализовать в PHP Вот такая реализация: $s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"; $res = []; // Делим предложение $words = explode(" {", $s); foreach($words as $k => $w){ // цвета R, G, B preg_match('/(\d+,\d+,\d+)\}?/', $w, $match); if(!empty($match)){ // Только текст без цветов R, G, B preg_match('/[^(\d+,\d+,\d+)\}?].+/', $w, $not_m); $res[] = [$match[1], $not_m[0]]; }else{ $res[] = ['0,0,0', $w]; } } print_r($res); Получаем результат: Array ( [0] => Array ( [0] => 0,0,0 [1] => Hello, world! ) [1] => Array ( [0] => 255,0,0 [1] => Привет, мир! ) [2] => Array ( [0] => 155,55,0 [1] => How are ) [3] => Array ( [0] => 100,3,5 [1] => you? ) )

Ответ 2



// TEXT $text = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"; // PARSE preg_match_all("#{(\d+,\d+,\d+)}#Uu", $text, $matches, PREG_OFFSET_CAPTURE|PREG_SET_ORDER); // VAR $result = []; $color = '0,0,0'; $offset = 0; // EACH foreach ($matches as $key => $value) { $text_sub = substr($text, $offset, ($value[0][1] - $offset)); if (mb_strlen($text_sub) > 0) { $result[] = array_merge(explode(',', $color), [$text_sub]); } $offset = $value[0][1] + mb_strlen($value[0][0]); $color = $value[1][0]; } // LAST $text_sub = substr($text, $offset); if (mb_strlen($text_sub) > 0) { $result[] = array_merge(explode(',', $color), [$text_sub]); } var_dump($result); Может и костыльно, но то что вам нужно, делает.

Ответ 3



Вот вам вариант без циклов: $text = '{100,0,0}Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?'; $str = array_filter(preg_split('~{(\d+),(\d+),(\d+)}~', $text)); preg_match_all('~(.+?){~', $text, $matches, PREG_SET_ORDER); $result = array_map(function ($x, $y) { return (!preg_match_all('/(\d+),(\d+),(\d+)/', $x[0], $match)) ? [0, 0, 0, $y] : [$match[1][0], $match[2][0], $match[3][0], $y]; }, $matches, $str); print_r($result);

Ответ 4



Вот примерно так получилось: s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?" s = s .. "\n" -- вынужденная мера, обозначим конец строки arr = {} local arr = {{0,0,0,""}} local i=1 for case in s:gmatch ("(.-[%c}])") do -- print ( case ) local text = case:match("(.+){") local r, g, b = case:match( "{(%d+),(%d+),(%d+)}") if r and g and b then arr[i+1] = {r,g,b,""} else text = case end arr[i][4] = text i=i+1 end -- test for k,v in pairs(arr) do print(k, v[1], v[2], v[3], v[4]) end результат: 1 0 0 0 Hello, world! 2 255 0 0 Привет, мир! 3 155 55 0 How are {100,3,5you?

Комментариев нет:

Отправить комментарий