4 votes

R vs sed regex gourmandise

Je ne comprends pas bien pourquoi cela n'entraîne pas "test" et j'apprécierais une explication :

a = "blah test"
sub('^.*(test|$)', '\\1', a)
# [1] ""

Comparez-la à la sed expression :

echo 'blah test' | sed -r 's/^.*(test|$)/\1/'
# test
echo 'blah blah' | sed -r 's/^.*(test|$)/\1/'
#

Pour info, ce qui suit permet d'obtenir ce que je veux en R (et est équivalent à ce qui précède). sed résultats) :

sub('^.*(test)|^.*', '\\1', a)

5voto

GSee Points 19079

Vous devez marquer le ^.* como non gourmand

> sub('^.*?(test|$)', '\\1', "blah test")
[1] "test"
> sub('^.*?(test|$)', '\\1', "blah blah")
[1] ""

2voto

Akash Points 2696

Le début de la regex engine correspond à tous les caractères jusqu'à la fin de la chaîne, soit gourmand .* puis il essaie de faire correspondre (test|$) c'est-à-dire soit le littéral 'test', soit la fin de la chaîne de caractères. Puisque le premier gourmand match de .* correspondait à tous les personnages, il back-references un caractère et essaie à nouveau de correspondre (test|$) ici $ correspond à la fin de la chaîne.

Si le résultat de votre match est un end of line character

Je pense sed utilise POSIX NFA qui essaie de trouver la correspondance la plus longue dans une Alternance, ce qui diffère de R qui semble utiliser un NFA traditionnelle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X