Regex para corresponder a vírgula Oxford ou serial

0

Eu aprendi um Regex para poder detectar frases com a vírgula Oxford e frases sem. Por exemplo

para uma frase como a abaixo

I went to the store and bought eggs, milk, apples, butter, and bread.

vou usar

(?:\w+,\s+){2,}and\s+\w+   

e para

I went to the store and bought eggs, milk, apples, butter and bread.

vou usar

(?:\w+,\s+){1,}\w+\s+and\s+\w+. 

Funciona bem no Ultraedit usando Perl.

No entanto, estou usando um software chamado SDL Studio e que é uma ferramenta Cat (ferramenta de tradução), e ele pode usar o Regex, mas, por algum motivo, não está aceitando esses Regex acima. Você pode, por favor, me avisar de qualquer outra fórmula Regex que possa funcionar bem, em vez do descrito acima, usando um motor Regex mais padrão?

    
por Sam Mouha 15.03.2017 / 22:01

1 resposta

2

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.

    
por ilkkachu 15.03.2017 / 22:55