Лично я не думаю, что 30 является особенно большим для регулярного выражения, поэтому я не буду слишком спешить, чтобы исключить это. Вы можете создать регулярное выражение с одной строкой кода:
var acronyms = new[] { "AB", "BC", "CD", "ZZAB" };
var regex = new Regex(string.Join("|", acronyms), RegexOptions.Compiled);
for (var match = regex.Match("ZZZABCDZZZ"); match.Success; match = match.NextMatch())
Console.WriteLine(match.Value);
// returns AB and CD
Таким образом, код относительно элегантен и удобен в обслуживании. Если вы знаете верхнюю границу для количества сокращений, я бы провел некоторое тестирование, которое знает, какие оптимизации там уже встроены в движок регулярных выражений. Вы также сможете бесплатно получить выгоду от будущих оптимизаций движка regex. Если у вас нет оснований полагать, что производительность будет проблемой, делайте это просто.
С другой стороны, регулярное выражение может иметь другие ограничения, например, по умолчанию, если у вас есть аббревиатуры AB, BC и CD, в «ABCD» он вернет только два из них как совпадение. Поэтому хорошо сказать, что есть аббревиатура, но вы должны быть осторожны, чтобы поймать несколько совпадений.
Когда производительность стала для меня проблемой (> 10000 элементов), я поместил «сокращения» в HashSet, а затем искал каждую подстроку текста (от минимальной длины акронима до максимальной длины акронима). Это было хорошо для меня, потому что исходный текст был очень коротким. Я не слышал об этом раньше, но на первый взгляд алгоритм Aho-Corasick, упомянутый в вопросе, на который вы ссылаетесь, кажется лучшим общим решением этой проблемы.