OVH Cloud OVH Cloud

possible regexp ?

5 réponses
Avatar
jeanpierre.vidal
Bonjour,

Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"

Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.

Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;
} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position

Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.

Merci pour vos suggestions,

Jean-Pierre

5 réponses

Avatar
jeanpierre.vidal
(Jean-Pierre Vidal) wrote in message news:...
Bonjour,

Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"

Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.

Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;


pardon : $shift = 0;

} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position

Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.

Merci pour vos suggestions,

Jean-Pierre


Avatar
dominix
Jean-Pierre Vidal wrote:
Bonjour,

Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"

Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.

Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;
} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position

Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.

Merci pour vos suggestions,

Jean-Pierre



je ne suis pas sur du tout d'avoir bien compris,
toutefois je suggere a la place de tout ça:

$longueur = length($old_value);
$nouveau = length($new_value);
$ix_curseur = $longueur + ( $nouveau - $longueur);

--
dominix

Avatar
jeanpierre.vidal
"dominix" <dominix"at"despammed.com> wrote in message news:<3fba96c8$0$255$...
Jean-Pierre Vidal wrote:
Bonjour,

[snip]


Merci pour vos suggestions,

Jean-Pierre



je ne suis pas sur du tout d'avoir bien compris,
toutefois je suggere a la place de tout ça:

$longueur = length($old_value);
$nouveau = length($new_value);
$ix_curseur = $longueur + ( $nouveau - $longueur);


Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')

Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}

Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"

Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?

Jean-Pierre


Avatar
dominix
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:

[snip]




Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')

Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}

Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"

Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?



je comprend mieux le probleme, et je pense que c'est le bon NG pour
la question.
IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une
solution avec map ou splice mais je trouve ta solution tres elegante.
peut etre un bon golfeur pourra compacter encore un peu, mais bon ...

--
dominix



Avatar
jeanpierre.vidal
"dominix" <dominix"at"despammed.com> wrote in message news:<3fbf443b$0$27014$...
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:

[snip]




Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')

Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}

Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"

Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?



je comprend mieux le probleme, et je pense que c'est le bon NG pour
la question.
IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une
solution avec map ou splice mais je trouve ta solution tres elegante.
peut etre un bon golfeur pourra compacter encore un peu, mais bon ...


merci dominix, c'est vrai que les RE ne sont pas bonne a tout faire,
mais plus j'avance dans l'apprentissage de perl, plus je m'aperçois
que j'en utilise :)

Jean-Pierre