сопоставление длинных строк (в основном похожих) с длинными строками

#regex #algorithm #string-matching

#регулярное выражение #алгоритм #сопоставление строк

Вопрос:

Я пытаюсь найти наилучший способ сопоставления и распознавания разных лицензионных текстов в файлах. Это довольно длинные многострочные строки (иногда страницы размером с 2 буквы), и при сопоставлении они должны быть в основном одинаковыми, за исключением нескольких переменных (имя, дата, нечетные новые строки, нечетные пробелы). Мой вопрос в том, каков наилучший способ сопоставления длинных строк в еще более длинных строках? Оправдано ли для этого использование регулярных выражений (огромное регулярное выражение, которое будет содержать весь текст лицензии с несколькими подстановочными знаками для переменных элементов)? Или есть алгоритм поиска / сопоставления строк, который был бы специально адаптирован?

Комментарии:

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

Ответ №1:

Прочитайте о самой длинной общей подпоследовательности из 2 строк. Алгоритм, основанный на динамическом программировании

Ответ №2:

Большинство библиотек регулярных выражений настроены на быструю работу с обычными регулярными выражениями, которые люди обычно пишут, иногда игнорируя редкие случаи, когда вы можете создавать регулярные выражения, которые заставляют их занимать ужасное количество времени. Если ваш шаблон не является одним из ужасных особых случаев, вероятно, не имеет большого значения, насколько он длинный, потому что на практике большинство мест, где он не соответствует тексту, можно распознать, проверив только несколько символов текста и шаблона, и эти несоответствия — это то, где времяидет.

Если вы хотите быть уверены в хорошей производительности, я бы поискал одну строку фиксированного текста (как можно большего размера), которая должна существовать во всех формах лицензии, найдите это в файлах, а затем перепроверьте несколько вхождений этого более сложным способом, чтобы увидеть, являются ли онисоответствует истине или нет. Но очень вероятно, что это в значительной степени то, что произойдет на практике, если вы выполняете обычный поиск по регулярным выражениям. Почему бы не использовать ваше регулярное выражение для файлов или для их подмножества и посмотреть, сколько времени это займет?