Если вам не нравятся регулярные выражения на 100%, не пытайтесь использовать их для чего-то подобного. Просто сделайте это вместо:
string s = test_string.toLowerCase();
if (s.contains("parsing") && (s.contains("error") || s.contains("warning")) {
....
потому что, когда вы вернетесь к своему коду через шесть месяцев, вы сразу поймете его.
Редактировать: Вот регулярное выражение, чтобы сделать это:
(?i)(?=.*parsing)(.*(error|warning).*)
но это довольно неэффективно. Для случаев, когда у вас есть условие ИЛИ, гибридный подход, при котором вы ищете несколько простых регулярных выражений и программно комбинируете результаты с Java, как с точки зрения читабельности, так и эффективности.