As classes de caracteres ( \w , \s e outras) são uma característica das regexes Perl . A substituição mais comumente suportada para isso seria o conjunto de caracteres entre colchetes: [a-zA-Z] para letras, [0-9] e [ \t\n] para espaços em branco. É claro, isso pressupõe que não existam outras letras além das 26 letras inglesas em ASCII simples e ignora alguns caracteres raros em branco também. Também há classes de caracteres nomeadas, como [[:alpha:]] , que funcionam de forma semelhante, mas pode haver lugares em que elas não funcionam.
(?:...) também é um Perlism, que você pode substituir com (...) se não estiver interessado em capturar a parte correspondente entre parênteses.
Então, eu tentaria transformar o primeiro ER em:
([[:alpha:]]+,[[:space:]]+){2,}and[[:space:]][[:alpha:]]+
ou o mais simples, direto e não geral:
([a-z]+, +){2,}and +[a-z]+
Ambos trabalham com o GNU grep com expressões regulares estendidas habilitadas ( -E sinalizador de linha de comando) e são um pouco padrão, mas é claro que o seu aplicativo suporta pode não ser o mesmo. A próxima construção a ser um problema seria a correspondência de contagem de {N,M} , o que é bastante irritante de substituir, já que você precisaria repetir o grupo anterior. (Embora note que (...){1,} é exatamente o mesmo que (...)+ .)
Há uma referência sobre as regexes usuais na regex(7) man page , e se você realmente quer saber detalhes sangrentos e diferenças entre variantes, veja Por que minha expressão regular funciona em X mas não em Y? no unix.SE.