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.