Хорошо, в комментарии вы пояснили, что хотите сопоставить все строки, которые либо равны одной из строк во входном наборе, либо отличаются только от одной из них в рамках заданного уровня «вариации». Поскольку вы не определили «вариацию» точно, я собираюсь использовать расстояние Левенштейна .
Учитывая строку s
и целое число n
, вы можете построить регулярное выражение, которое точно соответствует всем строкам, у которых расстояние Левенштейна составляет n
или меньше, до этой строки, например:
Сначала мы напишем функцию, которая с учетом s
и n
возвращает список простых регулярных выражений, которые при совместном сопоставлении всех строк на расстоянии n
или меньше равны s
. Здесь «простое регулярное выражение» означает регулярное выражение, которое содержит только буквенные символы и подстановочные знаки.
Для n=0
эта функция просто возвращает [s]
. В противном случае он вычисляет список для n-1
и затем просматривает каждый элемент в нем. Для каждого элемента r
и каждой позиции i
, где 0 <= i < length(r)
, в список добавляется следующее регулярное выражение:
- Регулярное выражение, где
.
было добавлено к r
в позиции i
.
- Регулярное выражение, в котором
i
-й символ r
был удален.
- Регулярное выражение, в котором
i
-й символ r
был заменен на .
.
Теперь, чтобы вычислить регулярное выражение для заданного набора строк и заданное значение для n
, мы вычисляем список для каждой строки, а затем or
все регулярные выражения вместе в одно большое регулярное выражение.
Обратите внимание, что это очень скоро приведет к очень большому регулярному выражению.