В программе сканирования файлов D я реализую логику поиска всех ударов набора ключевых строк вместе со строкой и столбцом, подобным Grep.Сканирование файлов с одним проходом
Мой текущий алгоритм работает, вызывая find
до конца файла. Когда обнаружено попадание, я ищу назад и вперед для обнаружения смещения байта для начала и конца строки попадания. Затем я снова ищу назад, чтобы найти количество строк новой строки между началом файла и смещением начала удара. Это, конечно, не эффективное и элегантное решение, но в настоящее время оно работает и помогло понять, как я работаю на срезах.
Теперь я хочу реорганизовать этот код, чтобы использовать некоторую комбинацию государственных машин (Monads), которые нужно только один раз бросить файл, и что он обновляется и работает на массиве строк-запусков, найденных до сих пор (size_t[]
). На что такое std.algorithm
s должно наложить такое решение? Этот алгоритм должен выводить массив кортежей, где каждый кортеж содержит фрагмент хита, лок/эол-срез и номер строки.
Да, но я хочу поддержки для поиска ключей, которые охватывают несколько-линии. И я хочу, чтобы это было в том же самом проходе, что и подсчет строк. Я мог бы, конечно, выполнить поиск подстроки в каждой строке, а затем реализовать какое-то особое поведение, которое продолжает искать на следующей строке. Но я не уверен, что это самое общее решение. Как насчет продолжения вызова Variadic-find с первой иглой, являющейся символом новой строки (или набором игл, если мы хотим, чтобы все версии кодировок новой строки), а остальные строки поиска? –
@ Nordlöw вы можете разделить иглу на линии, когда есть только 1 линия, используйте версию в ответе. Когда есть несколько строк, вы можете сделать 'endsWith' для первой линии иглы, а затем« равно »для следующих строк и, наконец,' startWith' с последней строкой иглы –
BTW: Когда я должен использовать игла-вариационная версия 'find' вместо' (ct) Regex'? Почему? –