У меня есть длинная строка переменной, хранящаяся в индексе таблицы, например:

my_table[4] = MYHOST1.fully.qualfied.com

У меня есть список имен хостов, которые я прочитал из файла, которые возвращаются в виде строки. Я повторяю это с помощью цикла for.

MYHOST1 MYHOST2 MYHOST3

По какой-то причине:

print (string.match(match_string, machine))

Не соответствует, хотя «match_string» содержит правильное значение из моей таблицы, а «machine» содержит правильное имя, которое я повторяю. Есть ли что-то особенное, что мне нужно сделать с переменной строкой здесь?

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

function read_giant_file(file_name)
local header_true = 0
local max_fields = 1
local machine_count = table.maxn(machine_names)
local machine_list = table.concat(machine_names,' ')
--print (machine_count)
--print (machine_list)
for line in io.lines(file_name) do                                                      
    for machine in machine_list:gmatch"%g-[%s]" do                                  
            print ("machine: "..machine)                                            

            for field in line:gmatch("(.-)\t") do                                   
                    table.insert(field_table, field_index, field)                   
                    print ("field_index: "..field_index.. "field: "..field)      
                    field_index = field_index + 1                                   

            end    

            if header_true == 0 then                                                
                    for key, value in pairs(field_table) do                         
                            print ("key: "..key," ".."header: "..value)             
                    end                                                             
                    header_true = 1                                                 
                    max_fields = table.maxn(field_table)                            
                    print ("write out headers")                                     

                    for i = 1,table.maxn(field_table) do                            
                            print ("i: "..i)i                                       
                            table.insert(field_table,i,nil)                         
                    end                                                             



                    field_index = 1                                                 
            end     -- close loop for header

            print ("field index: "..field_index)                                    
            print ("max fields: "..max_fields)                                      
            if field_index >= max_fields and max_fields > 0 and header_true ~= 0 then 
                     print ("FT: "..field_table[4])                                  
                    print ("machine: "..machine)                                    
                    local match_string = field_table[4]                             
                    print (string.match(match_string, machine))                     
                    i, n = string.find(field_table[4], 'machine')                   
                    print (i,n)                                                     
                    if i ~= nil then                                                
                            print ("matchy")                                        
                    end
                    field_index = 1                                                 
            end




    end 
    end

Конец

Конец

================================================== ===========

-2
Argh Tastic 13 Дек 2019 в 08:37
Не могли бы вы добавить результат печати этих обеих переменных?
 – 
csaar
13 Дек 2019 в 10:27
2
Можете ли вы показать нам полный код для этого, поскольку я могу только догадываться, видя два имени переменных и ничего о том, как или что они были назначены?
 – 
Taazar
13 Дек 2019 в 14:12
Спасибо за ваш код. не могли бы вы просто предоставить текст и шаблон в виде строки?
 – 
Piglet
13 Дек 2019 в 20:42
Не точный текст (который я не хочу/не могу раскрывать данные.), но он функционально такой же, указан в первой части этого запроса
 – 
Argh Tastic
13 Дек 2019 в 22:51
Вы не можете спрашивать, почему шаблон не соответствует тексту, если вы не предоставляете оба. разве это не очевидно? вы просто указываете имена переменных. приведите пример, который дает тот же результат, что и ваши реальные данные
 – 
Piglet
13 Дек 2019 в 23:20

1 ответ

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

Вот функция, которую я добавил:

function trim(string) local trimmed = string:find"%S" return trimmed and string:match(".*%S", trimmed) or "" end

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

0
Argh Tastic 15 Дек 2019 в 20:45