Настройте поиск по таблице данных, реализовав логику регулярных выражений.Jquery

Программирование на jquery
Ответить Пред. темаСлед. тема
Anonymous
 Настройте поиск по таблице данных, реализовав логику регулярных выражений.

Сообщение Anonymous »

У меня есть таблица данных, в которой я устанавливаю настраиваемую логику поиска (с И и ИЛИ), переводя строку поиска в выражение регулярного выражения с помощью функции searchStringToRegexString. Следующие строки поиска затем преобразуются в:
'term1 AND term2' => (?=.*term1)(?=.*term2)

'term1 OR term2' => (?=.*term1)|(?=.*term2)

'term1 term2' => (?=.*term1 term2)

'term1 term2 OR term3 AND term4' => (?=.*term1 term2)|(?=.*term3)(?=.*term4)

Хотя настраиваемый поиск работает должным образом для поиска по столбцам, при глобальном поиске возникают следующие проблемы:
(A.) Глобальный поиск поиск по запросу «форд ИЛИ собака» работает нормально. Однако «ма И кот» показывает нулевые результаты, что неверно.
(Б.) Кроме того, при переключении на поиск по столбцу, например, на столбец «домашнее животное», и вводе выполните поиск "cat", отображаемая глобальная строка поиска изменится с "ma AND cat" на "(?=.*ma)(?=.*cat)".
Для решения проблемы , я отвязал назначенные обработчики событий. Однако глобальный поиск, похоже, неправильно интерпретирует строку регулярного выражения.
Если кто-нибудь может, дайте мне несколько советов о том, как разрешить поиск по регулярному выражению для глобального поиска.
Изображение

library(DT)
library(shiny)

ui = fluidPage(
shiny::tags$script("
function searchStringToRegexString(search_str) {
let term_before = false;
let regex_str = '(?=.*';
let parts = search_str.trim().split(' '); // array with terms split by spaces
for (let part of parts) {
if ((part === 'AND') || (part === 'OR')) {
regex_str += (part === 'AND') ? ')(?=.*' : ')|(?=.*'; // 'term1 AND term2' => (?=.*term1)(?=.*term2), 'term1 OR term2' => (?=.*term1)|(?=.*term2)
term_before = false;
} else {
regex_str += (term_before === true) ? (' ' + part) : part; // 'term1 term2' => (?=.*term1 term2)
term_before = true;
}
}
regex_str += ')';
regex_str = regex_str.replace('|(?=.*)', '').replace('(?=.*)', ''); // remove empty ANDs and ORs
console.log('search_str:', search_str, ', regex_str:', regex_str);
return regex_str;
}
"),
fluidRow(
column(width = 12,
DTOutput("dtable")
)
)
)

server = function(input, output, session) {
data = data.frame(
car = c("Mazda", "Mazda RX4", "Mazda RX4 Wag", "Ford", "Mercedes"),
pet = c("dog", "dog", "cat", "cat", "cat")
)

output$dtable = renderDT({
datatable(
data,
filter = list(position = "top", clear = TRUE, plain = FALSE),
options = list(
searchDelay = 1500,
dom = "ft",
columnDefs = list(list(targets = "_all", className = "dt-center")),
fixedHeader = FALSE,
initComplete = JS("
function(settings) {
let glo_search_handler = $('.dataTables_filter input');
let instance = settings.oInstance;
let col_search_handler = instance.parent().find('.form-group input');
let table = instance.api();

col_search_handler.unbind(); // unbind the default datatable search handlers
glo_search_handler.unbind();

glo_search_handler.on('keyup.globalSearch', function(e) { // global search handler
//e.preventDefault(); // prevent the default form submit behavior
let glo_search_str = $(this).val().trim();
if (glo_search_str === '') {
table.search('').draw();
} else {
let glo_regex_str = searchStringToRegexString(glo_search_str);
table.search(glo_regex_str, true, false, true).draw(); // search term, regex, smart, caseInsensitive
}
});

col_search_handler.on('keyup.columnSearch', function(e) { // custom column search handler
//e.preventDefault(); // prevent the default form submit behavior
let col_search_str = $(this).val().trim();
let index = 1 + col_search_handler.index(this);
let column = table.column(index);
if (col_search_str === '') {
column.search('').draw();
} else {
let col_regex_str = searchStringToRegexString(col_search_str);
column.search(col_regex_str, true, false, true).draw();
}
});
}
")
)
)
}, server = TRUE)
}

shinyApp(ui = ui, server = server)


Подробнее здесь: https://stackoverflow.com/questions/783 ... egex-logic
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Jquery»