Поставили на одном проекте антимат на основе Antimat.pm Ильи Солдаткина.
Через некоторое время возникла необходимость его подправить. Было решено, что слово «фиг» матом считать не будем и заказчик захотел добавить еще пару слов. Как быть? Базовый шаблог модуля — строка длиной 12706 символов. Ходить по ней вдоль и что-то искать-править — врагу не пожелаешь.
При беглом изучении шаблона выяснил, что он разбит на отдельные блоки для разных словоформ, которые перечисляются через логическое ИЛИ (| — pipe). Каждый блок так-же может состоять из нескольких подблоков-альтернатив, для группировки и перечисления которых используются круглые скобки и тоже ИЛИ.
Пришла мысль представить данный шаблон в более удобочитаемом виде. Старый проверенный рецепт — структурное программирование — оператор с новой строки, вложенные блоки со смещением вправо. Чтобы не накосячить при ручноим разбиении и следуя старому правилу «лень — двигатель прогресса», на коленке набросал простенький парсер:

#include <stdio.h>
void
new_line(int d)
{
  int i;
  putc('\n',stdout);
  for(i=0;i<d;i++)putc(' ',stdout);
}
int
main(void)
{
  int d=0;
  char c,l=0;
  while(!feof(stdin)){
    c=getc(stdin);
    if(c=='('){d+=2;new_line(d);}
    putc(c,stdout);l++;
    if(c==')'){d-=2;if(d<=0)l=0;}
    if(c=='|'){new_line(d);}
  }
}


В итоге вмесло «змеи» вида:
a[\W_]*s[\W_]*s(?:[\W_]*e[\W_]*s)?|f[\W_]*u[\W_]*c[\W_]*k(?:[\W_]*i............


получил нечто более читабельное:
a[\W_]*s[\W_]*s
  (?:[\W_]*e[\W_]*s)?|
f[\W_]*u[\W_]*c[\W_]*k
  (?:[\W_]*i[\W_]*n[\W_]*g)?|
..................


Результат конечно не идеален, при переходе к новому блоку есть глюки вида:
........
        (?:[\W_]*[иiu])?)?))|

  (?:[нhn][\W_]*[еe][\W_]*)?
  (?:
........


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

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