Поскольку у вас так мало критериев в отношении формата ваших данных, вам может потребоваться использовать несколько иной подход, который может быть или не быть осуществимым в зависимости от размера ваших данных / потребности в пропускной способности для приложения. Одно из предложений - начать с полнотекстового соответствия и только в том случае, если это не дает результатов, перейти к более обобщенному поиску или другим вариантам.
В предыдущем примере вы можете начать с полного поиска по ключевым словам:
.*American.*Psycho.*
, и если это не дает результатов, попробуйте поиск по чистой аббревиатуре
.*AP.*
и, если это не удается, поиск по одному ключевому слову
.*((American)|(Psycho)).*
и затем поиск по смешанному ключевому слову / сокращению
.*(A|(American)).*(P|(Psycho))
и т.д.. Опять же, этот подход может быть значительно затруднен в зависимости от того, насколько быстро выполняются поиски / насколько быстро они нужны.
Если это неприемлемо, вы можете попробовать использовать один «свободный» шаблон, как указано выше, с модификациями попыток разрешить полное совпадение слов, если это возможно, а также минимизировать группировку между ключевыми словами.
.*(A[merican]*)(.*?)(P[sycho]*)
Обратите внимание, что мы используем класс символов (квадратные скобки) вместо обычной группировки (круглые скобки), чтобы разрешить частичное совпадение с оставшимся заголовком. то есть предыдущий будет соответствовать "Amer. Psy.". Затем, основываясь на полученных совпадениях, вы можете провести дальнейшую проверку группировки, чтобы исключить ложные срабатывания. Например, если группа 1 соответствует только «A», вы можете ожидать, что группа 2 будет пустой или содержать только не буквенно-цифровые символы, а если этого не произойдет, вы отклоните ее как ложное срабатывание.