Регулярное выражение для поиска по ячейкам таблицы, не строкам

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
Здравствуйте.

Есть экшен взять строку из таблицы.

Удовлетворяющую регулярному выражению.

Проблема и задача в следующем:

В таблице есть строки содержащие в ячейке F данные:

1domain.ru
2domain.ru
*domain.ru
domain.ru

* - любой неизвестный нам символ.

Другие ячейки таблицы содержат произвольные наборы символов.

Как нам взять строку из таблицы, в ячейке F, которой только строго "domain.ru"?

Пробовал:

1)
Регулярку: ^domain.ru

Но тогда он считает ^ как начало строки, а не начало ячейки. Поэтому domain.ru не находит.

2) Пробовал нечто вроде такого:
(?:(?![0-9a-zа-яёЁ-]).)domain.ru

Чтобы найти любой символ который может означать разделение столбцов. Но увы ничего не вышло.

Символы: Tab ; , \n
тоже не получилось.

Как мне найти начало ячейки хотя бы?
 

Вложения

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 931
Благодарностей
9 329
Баллы
113
@Devostator Вот тут, по моему, то что нужно:


Либо еще вот такую регулярку можно использовать: ^(?:[^;\n]*;){5}\bdomain\.ru\b(?:;|$)
 
  • Спасибо
Реакции: Devostator

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 769
Благодарностей
1 363
Баллы
113
Нахожу номер нужной строки вот таким сниппетом:
C#:
string table_1ColText1 = project.Variables["table_column"].Value;

var table_1 = project.Tables["Таблица"];
var chekVar1 = project.Variables["text_to_find"].Value;

int RowCount1 = project.Tables["Таблица"].RowCount;
RowCount1 = RowCount1-1;

for (int m = 0; m<=RowCount1; m++)
    {
        if (table_1.GetCell(table_1ColText1, m) == chekVar1)
            {
            return m;
            }
    }
Соответственно, задаем в настройках колонку, по которой искать, текст, который искать (точное совпадение в ячейке), получаем в переменную нужную, дальше уже решаем, что с ней делать...

130803
Наверное, можно и другими сниппетами сразу решать поставленную задачу, но мне обычно надо просто найти нужную строку, а дальше уже в зависимости от задачи (они бывают разные) обрабатывать разные колонки.
 
  • Спасибо
Реакции: Devostator

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
Нахожу номер нужной строки вот таким сниппетом:
C#:
string table_1ColText1 = project.Variables["table_column"].Value;

var table_1 = project.Tables["Таблица"];
var chekVar1 = project.Variables["text_to_find"].Value;

int RowCount1 = project.Tables["Таблица"].RowCount;
RowCount1 = RowCount1-1;

for (int m = 0; m<=RowCount1; m++)
    {
        if (table_1.GetCell(table_1ColText1, m) == chekVar1)
            {
            return m;
            }
    }
Соответственно, задаем в настройках колонку, по которой искать, текст, который искать (точное совпадение в ячейке), получаем в переменную нужную, дальше уже решаем, что с ней делать...

Наверное, можно и другими сниппетами сразу решать поставленную задачу, но мне обычно надо просто найти нужную строку, а дальше уже в зависимости от задачи (они бывают разные) обрабатывать разные колонки.
Спасибо за решение!

Сниппет кстати хороший. Сохраню для другой задачи, поиска номера строки по точному совпадению.

К сожалению для моей задачи не очень удобно, т.к. много разных таблиц, я иногда даже заранее не знаю в каком столбце будет нужное мне значение. Вообщем есть много нюансов из-за которых вынужден искать решение.

В тз я естественно указал сильно упрощенную модель, т.к. предполагал что решение будет универсальным. Учитывая сколько зенка существует, почему-то думал что такая простая штука как поиск точного совпадения по ячейкам - это мастхэв экшен для таблиц в конструкторе яля ЗП.

@Devostator Вот тут, по моему, то что нужно:


Либо еще вот такую регулярку можно использовать: ^(?:[^;\n]*;){5}\bdomain\.ru\b(?:;|$)
К сожалению регулярка не сработала. По ссылке регулярка работает не так как мне надо.

Странно кстати, \ba\b находит любое слово содержащее символ a. Хотя судя по описанию ключа, работать должно не так.

В любом случае, пока тут копался, лучше своего костыля не нашёл.

Код:
(?:(?![0-9a-zа-яёЁ-])){-Variable.domain-}(?:(?![0-9a-zа-яёЁ-]))
Находит, то что нужно. Может пригодится кому.
 
  • Спасибо
Реакции: Sergodjan

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 931
Благодарностей
9 329
Баллы
113
К сожалению регулярка не сработала. По ссылке регулярка работает не так как мне надо.
В моей регулярке нужно скорректировать разделитель - в ней сейчас ; используется в этом качестве.
Я проверял на своей тестовой таблице - все работало.
 
  • Спасибо
Реакции: Devostator

K R

Client
Регистрация
14.01.2017
Сообщения
134
Благодарностей
143
Баллы
43
Вот этот код получает номер строки с совпадением. Номер столбца с нужным текстом не имеет значения, его тоже можно получить при помощи этого кода.

Поиск точного совпадения в любом столбце таблицы:
// Таблица, в которой нужно найти значение
IZennoTable table = project.Tables["Data"];

// Значение, которое ищем
string lookfor = project.Variables["lookfor"].Value;

// На случай, если совпадение не будет найдено
int rowNumber = -1;
// int columnNumber = -1;

// Цикл с перебором всех строк
for (int i = 0; i < table.RowCount; i++)
{
    var columns = new List<string>(table.GetRow(i));

    // Цикл с перебором всех ячеек во взятой строке
    for (int j = 0; j < columns.Count; j++)
        if (columns[j] == lookfor)
    {
        rowNumber = i;
        // columnNumber = j;
        break;
    }

    // Если совпадение найдено
    if (rowNumber != -1)
    {
        break;
    }
}

// Записываем в переменную проекта номер строки, в которой обнаружено совпадение
project.Variables["rowNumber"].Value = rowNumber.ToString();

/*
// Конвертация номера столбца в буквенный вид и запись в переменную
if (columnNumber != -1)
{
    string letters = "";
    int num = columnNumber + 1;

    while (num > 0)
    {
        int remainder = (num - 1) % 26;
        letters = Convert.ToChar('A' + remainder) + letters;
        num = (num - 1) / 26;
    }
    
    project.Variables["columnNumber"].Value = letters;
}
else {
    project.Variables["columnNumber"].Value = "-1";
}
*/
В переменную rowNumber вернется номер первой строки, в которой будет обнаружено совпадение.

Если поиск должен быть регистронезависимым, то нужно поменять строку 18
if (columns[j] == lookfor)
на
if (columns[j].ToLower() == lookfor.ToLower())

Если нужно получить столбец, в котором находится нужная ячейка, то необходимо раскомментировать строки 9, 21, 35-54. Результат в переменной columnNumber будет в виде буквенного кода столбца.

Если совпадений нет, то в переменных rowNumber и columnNumber будет значение "-1".
 
  • Спасибо
Реакции: Devostator

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
Вот этот код получает номер строки с совпадением. Номер столбца с нужным текстом не имеет значения, его тоже можно получить при помощи этого кода.

Поиск точного совпадения в любом столбце таблицы:
// Таблица, в которой нужно найти значение
IZennoTable table = project.Tables["Data"];

// Значение, которое ищем
string lookfor = project.Variables["lookfor"].Value;

// На случай, если совпадение не будет найдено
int rowNumber = -1;
// int columnNumber = -1;

// Цикл с перебором всех строк
for (int i = 0; i < table.RowCount; i++)
{
    var columns = new List<string>(table.GetRow(i));

    // Цикл с перебором всех ячеек во взятой строке
    for (int j = 0; j < columns.Count; j++)
        if (columns[j] == lookfor)
    {
        rowNumber = i;
        // columnNumber = j;
        break;
    }

    // Если совпадение найдено
    if (rowNumber != -1)
    {
        break;
    }
}

// Записываем в переменную проекта номер строки, в которой обнаружено совпадение
project.Variables["rowNumber"].Value = rowNumber.ToString();

/*
// Конвертация номера столбца в буквенный вид и запись в переменную
if (columnNumber != -1)
{
    string letters = "";
    int num = columnNumber + 1;

    while (num > 0)
    {
        int remainder = (num - 1) % 26;
        letters = Convert.ToChar('A' + remainder) + letters;
        num = (num - 1) / 26;
    }
   
    project.Variables["columnNumber"].Value = letters;
}
else {
    project.Variables["columnNumber"].Value = "-1";
}
*/
В переменную rowNumber вернется номер первой строки, в которой будет обнаружено совпадение.

Если поиск должен быть регистронезависимым, то нужно поменять строку 18
if (columns[j] == lookfor)
на
if (columns[j].ToLower() == lookfor.ToLower())

Если нужно получить столбец, в котором находится нужная ячейка, то необходимо раскомментировать строки 9, 21, 35-54. Результат в переменной columnNumber будет в виде буквенного кода столбца.

Если совпадений нет, то в переменных rowNumber и columnNumber будет значение "-1".
Мне нравится определенно!
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
В моей регулярке нужно скорректировать разделитель - в ней сейчас ; используется в этом качестве.
Я проверял на своей тестовой таблице - все работало.
Странно, сегодня у меня не работает ни моя ни ваша. Очень странно.

Разделитель в таблице также ;

Скриншот приложил. Может я слепой?
 

Вложения

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 931
Благодарностей
9 329
Баллы
113
Странно, сегодня у меня не работает ни моя ни ваша. Очень странно.

Разделитель в таблице также ;

Скриншот приложил. Может я слепой?
Там еще есть важная штука - количество столбцов до нужного нам столбца.
Если нужно отслеживать столбец B, то регулярка будет такая: ^(?:[^;\n]*;){1}\b7\b(?:;|$)
То есть, {5} заменили на {1}
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
Там еще есть важная штука - количество столбцов до нужного нам столбца.
Если нужно отслеживать столбец B, то регулярка будет такая: ^(?:[^;\n]*;){1}\b7\b(?:;|$)
То есть, {5} заменили на {1}
Я попробовал (для столбца F):

C#:
^(?:[^;\n]*;){1}\b{-Variable.domain-}\b(?:;|$)
    
^(?:[^;\n]*;){1,10}\b{-Variable.domain-}\b(?:;|$)

^(?:[^;\n]*;){5}\b{-Variable.domain-}\b(?:;|$)

^(?:[^;\n]*;)*\b{-Variable.domain-}\b(?:;|$)
Хоть убей ничего не находит.

Хотя я четко вижу в табличке то что ищу
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
282
Благодарностей
31
Баллы
28
Спасибо за решение!

Сниппет кстати хороший. Сохраню для другой задачи, поиска номера строки по точному совпадению.

К сожалению для моей задачи не очень удобно, т.к. много разных таблиц, я иногда даже заранее не знаю в каком столбце будет нужное мне значение. Вообщем есть много нюансов из-за которых вынужден искать решение.

В тз я естественно указал сильно упрощенную модель, т.к. предполагал что решение будет универсальным. Учитывая сколько зенка существует, почему-то думал что такая простая штука как поиск точного совпадения по ячейкам - это мастхэв экшен для таблиц в конструкторе яля ЗП.



К сожалению регулярка не сработала. По ссылке регулярка работает не так как мне надо.

Странно кстати, \ba\b находит любое слово содержащее символ a. Хотя судя по описанию ключа, работать должно не так.

В любом случае, пока тут копался, лучше своего костыля не нашёл.

Код:
(?:(?![0-9a-zа-яёЁ-])){-Variable.domain-}(?:(?![0-9a-zа-яёЁ-]))
Находит, то что нужно. Может пригодится кому.
Я попробовал (для столбца F):

C#:
^(?:[^;\n]*;){1}\b{-Variable.domain-}\b(?:;|$)
   
^(?:[^;\n]*;){1,10}\b{-Variable.domain-}\b(?:;|$)

^(?:[^;\n]*;){5}\b{-Variable.domain-}\b(?:;|$)

^(?:[^;\n]*;)*\b{-Variable.domain-}\b(?:;|$)
Хоть убей ничего не находит.

Хотя я четко вижу в табличке то что ищу

Chatgpt поправил мне регулярку, нужно было в начале lookbehind. Видимо заработался и опечатался.

Вот это нашло то что нужно, после всех возможных тестов.

Строгое условие на поиск содержимого ячейки. Содержимое ячейки представлено в переменной {-Variable.domain-}

(?<![0-9A-Za-zА-Яа-яёЁ-]){-Variable.domain-}(?![0-9A-ZА-Яa-zа-яёЁ-])
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)