LINUX.ORG.RU

Поиска шаблона

 


0

1

Коллеги, попросили сделать поиск количества multiline шаблона типа такого

   @@ @@ 
     asd
   @@ @@
в большом текстовом файле .Вообще Регекспы в гошке быстры и имеют линейную зависимость, просто хотят не этим решением в лоб это сделать . Подскажите какие еще способы есть ?

P.S Не подошедшее решение

package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"regexp"
	"strings"
)

func main() {
	// Тут предствлено решения на стандартных регулярках , в принципе не должна быть большая разница
	// в большинстве случаев с интеловским hyperscan
	PatternFile := flag.String("pattern", "shablon.txt", "файл шаблона поиска")
	Filetosearch := flag.String("file", "bolshoy_file.txt", "сам файл в котором будет поиск")

	flag.Parse()

	//считаем что файл для скорости у нас вмещается в память
	//иначе придется читать кусками
	filep, err := os.Open(*PatternFile)
	if err != nil {
		log.Fatal(err)
	}
	defer filep.Close()

	b, err := ioutil.ReadAll(filep)
	pattern_cnt := string(b)

	file_landscape, err := os.Open(*Filetosearch)
	if err != nil {
		log.Fatal(err)
	}
	defer file_landscape.Close()

	b_2, err := ioutil.ReadAll(file_landscape)
	landscape_cnt := string(b_2)

	// делаем escape метасимволов
	pattern_cnt = regexp.QuoteMeta(pattern_cnt)

	//Меняем и убираем перевод новых строк и также для универсальность пробелы перед ними на s+
	pattern_cnt = strings.TrimSpace(pattern_cnt)
	pattern_cnt = strings.Replace(pattern_cnt, " ", "\\s+", -1)
	pattern_cnt = strings.Replace(pattern_cnt, "\n", "\\s+", -1)

	//добавим опцию нежадности(ленивости) для ускорения
	pattern_cnt = "(?U)" + pattern_cnt
	re_bug := regexp.MustCompile(pattern_cnt)

	//Тут в принципе может и индекс и сам найдейнный шаблон посмотреть
	//for i, match := range re_bug.FindAllString(landscape_cnt, -1) {
	//	fmt.Println(match, "index : ", i)
	//}

	fmt.Println(len(re_bug.FindAllString(landscape_cnt, -1)))
}

★★★★★

ну я вижу только вариант запилить fsm со стейтами и бегать построчно

anonymous
()
Ответ на: комментарий от anonymous

а можешь скинуть пример на каком языке где ишеться не один символ, а подстрока на fsm ( просто его не юзал со времен инста) ?

pinachet ★★★★★
() автор топика
Ответ на: комментарий от pinachet

И вообще как вариант заюзать Ахо-корасика ?

pinachet ★★★★★
() автор топика
Ответ на: комментарий от tz4678

Обход дерева рекурсивно ?

И второй вопрос есть считать crc ?

pinachet ★★★★★
() автор топика

Короче, сказали варианты с fsm и регэксами не катит, видно хотели этот извращенный вариант :

Искомая строка CRC-sum по сути сумма искомого слайса байтов ! вычислям CRC-sum в отрезке байтов того слайса(той же длинны) где ищите и сраниваете !
затем вычитая из CRC-sum первый байт отрезка и добавив следующий к отрезку получаете новый CRC-sum отрезка и сраниваете с CRC-sum искомой строки итд до конца строки(слайса)
При равенстве CRC-sum делаете контрольной сравнение побайтно и все. Извращенцы могут и CRC-XOR использовать

pinachet ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.