IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Regex + mots avant + mots après


Sujet :

Langage Perl

  1. #1
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut Regex + mots avant + mots après
    Bonjour,

    Mieux vaut tard que jamais, je me mets un peu aux regex, d'autant que j'en ai besoin.
    Je fais souvent des recherches simples sur de longs textes, parfois un livre entier.
    Je voudrais sélectionner quelques mots avant et après la regex pour mieux me repérer dans le texte.

    Sans les mots Avant/Après ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $Regex;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = $TexteInput =~ /($Pattern)/g;
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
    Avec mots Avant/Après tel que je l'ai imaginé c'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    ...
    my $MotAvant   = "(\\w+ ){0,5}";
    my $MotApres   = "(\\w+ ){0,5}";
    ...
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $MotAvant.$Regex.$MotApres;
     
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = $TexteInput =~ /($Pattern)/g;
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
    J'ai fait pas mal d'essais...

    Pour plus de facilité, je colle tout l'embryon de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use Tk;
    use Tk::LabFrame;
    use Tk::ROText;
     
    my $RepBas     = 'E:/_APPLI/Regex';
    my $LabMessage = "";
    my $LabRegex   = "";
    my $MotAvant   = "(\\w+ ){0,5}";
    my $MotApres   = "(\\w+ ){0,5}";
     
    ActiverAccentsDOS();
     
    my $fen  = MainWindow->new;
    my $width = $fen->screenwidth();
    my $height = $fen->screenheight();
    $fen->destroy();
     
    # Creation du widget principal
    my $Wm = MainWindow->new(
    	-width			=> $width,
    	-height			=> $height,
    	-title      => "Regex",
      -background => 'white',
    );
     
    $width = $Wm->screenwidth*(4/5);
    $height = $Wm->screenheight*(4/5);
    $Wm->configure(-height=>$height, -width=>$width, -title=>"Recherche dans un fichier");
    $Wm->geometry( $width ."x". $height );
    $Wm->MoveToplevelWindow (100,100);
    #$Wm->overrideredirect(1);
    #$Wm->packPropagate(0);
    #$Wm->raise();
     
    ###############################
    # Scrolled qui affiche le texte
    my $widget_input = $Wm->Scrolled(
      'Text',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 16 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFAA3',
    );
     
    my $widget_output = $Wm->Scrolled(
      'ROText',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 16 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFA30',
    );
     
    # Cadre des configurations
    my $couleur_commune = '#E0F0FF';
     
    # Cadre Gestion
    my $cadre_gestion = $Wm->LabFrame(
      -label      => 'Gestion',
      -background => $couleur_commune,
      -font       => '{Simplified Arabic} 10 {bold}',
    );
    #configurer_tags($widget_input);
    #configurer_tags($widget_output);
     
    # Regex
    my $Regex = "";
    my $LabelRegex = $cadre_gestion->Label(
    	-text => "Regex",
    	-font => '{Simplified Arabic} 10 {bold}',
    );
     
    my $RegexSaisie = $cadre_gestion->Entry(
    	-width				=> 100,
    	-justify			=> 'left',
    	-textvariable	=> \$Regex,
    	-font					=> '{Simplified Arabic} 10 {bold}',
    );
     
    # Start
    my $bouton_start = $cadre_gestion->Button(
    	-text    => "Start",
    	-command => sub {
    		$widget_output->delete( '0.0', 'end' );
    		Regex ();
    		$LabMessage = "Regex terminée";
    	},
    );
     
    # Clear
    my $bouton_clear = $cadre_gestion->Button(
    	-text    => "Clear",
    	-command => sub {
    		$widget_input->delete( '0.0', 'end' );
    		$widget_output->delete( '0.0', 'end' );
    		$LabMessage = "";
    	},
    );
     
     
    # Exit
    my $bouton_exit = $cadre_gestion->Button(
    	-text    => "Exit",
    	-command => [ \&fermer, ],
    );
     
    ####################################
    # Cadre pour les messages de service
    my $cadre_messages = $Wm->Frame( -background => $couleur_commune, );
     
    # Label qui affichera la Regex, en bas
    my $label_regex = $cadre_messages->Label(
      -textvariable => \$LabRegex,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    # Label qui affichera les messages, en bas
    my $label_message = $cadre_messages->Label(
      -textvariable => \$LabMessage,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    ####################################
    # Gestion de l'affichage des widgets
    #
    $cadre_messages->pack(qw / -side bottom -fill both -expand 0 /);
    $label_regex->pack(qw / -side left -fill both -expand 1 /);
    $label_message->pack(qw / -side left -fill both -expand 1 /);
     
    $widget_output->pack(qw / -side bottom -fill both -expand 1 /);
    $widget_input->pack(qw / -side bottom -fill both -expand 1 /);
     
    $cadre_gestion->pack(qw / -side right -fill both -expand 1 /);
     
    $LabelRegex->grid( $RegexSaisie, $bouton_start, $bouton_clear, $bouton_exit,
    	qw / -padx 2 -pady 5 -sticky nsew /
    );
     
    MainLoop;
     
    #############################################################################
     
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	#my $Pattern = $MotAvant.$Regex.$MotApres;
    	my $Pattern = $Regex;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = $TexteInput =~ /($Pattern)/g;
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
     
    sub fermer {
    	exit (0);
    }
     
    #########################################
    # Configuration des polices de caractères
    #
    sub configurer_tags {
    	my $widget_text = shift;
    	for my $police ( 12 .. 72 ) {
    		if ( $police % 2 == 0 ) {
    			$widget_text->tagConfigure(
    				"g$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'left',
    			);
    			$widget_text->tagConfigure(
    				"c$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'center',
    			);
    			$widget_text->tagConfigure(
    				"d$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'right',
    			);
    		}
    	}
    	return;
    }
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccentsDOS {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    J'ai fait ce bout de code car je n'ai pas toujours le temps de transformer, même de façon rudimentaire un .txt en .html
    MERCI d'avance pour votre aide !

    J'ai adapté une extension Firefox, ça donne une idée de ce que je souhaite obtenir, en plus simple :

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $words = qr/\s*(?:\w+\s+){0,5}/;
    my @results = ($TextInput =~ m/($words $Regex $words)/gx);
    --
    Jedaï

  3. #3
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    MERCI Jedai !

    Ça me met bien le pied à l'étrier !
    Ce n'est pas régulier comme réponse, à cause des virgules, apostrophes... mais la solution est bien là !

    je recolle le tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use Tk;
    use Tk::LabFrame;
    use Tk::ROText;
     
    my $RepBas     = 'E:/_APPLI/Regex';
    my $LabMessage = "";
    my $LabRegex   = "";
    my $Word   = qr/\s*(?:\w+\s+){0,5}/;
     
    ActiverAccentsDOS();
     
    my $fen  = MainWindow->new;
    my $width = $fen->screenwidth();
    my $height = $fen->screenheight();
    $fen->destroy();
     
    # Creation du widget principal
    my $Wm = MainWindow->new(
    	-width			=> $width,
    	-height			=> $height,
    	-title      => "Regex",
      -background => 'white',
    );
     
    $width = $Wm->screenwidth*(4/5);
    $height = $Wm->screenheight*(4/5);
    $Wm->configure(-height=>$height, -width=>$width, -title=>"Recherche dans un fichier");
    $Wm->geometry( $width ."x". $height );
    $Wm->MoveToplevelWindow (100,100);
    #$Wm->overrideredirect(1);
    #$Wm->packPropagate(0);
    #$Wm->raise();
     
    ###############################
    # Scrolled qui affiche le texte
    my $widget_input = $Wm->Scrolled(
      'Text',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 16 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFAA3',
    );
     
    my $widget_output = $Wm->Scrolled(
      'ROText',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 16 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFA30',
    );
     
    # Cadre des configurations
    my $couleur_commune = '#E0F0FF';
     
    # Cadre Gestion
    my $cadre_gestion = $Wm->LabFrame(
      -label      => 'Gestion',
      -background => $couleur_commune,
      -font       => '{Simplified Arabic} 10 {bold}',
    );
    #configurer_tags($widget_input);
    #configurer_tags($widget_output);
     
    # Regex
    my $Regex = "";
    my $LabelRegex = $cadre_gestion->Label(
    	-text => "Regex",
    	-font => '{Simplified Arabic} 10 {bold}',
    );
     
    my $RegexSaisie = $cadre_gestion->Entry(
    	-width				=> 100,
    	-justify			=> 'left',
    	-textvariable	=> \$Regex,
    	-font					=> '{Simplified Arabic} 10 {bold}',
    );
     
    # Start
    my $bouton_start = $cadre_gestion->Button(
    	-text    => "Start",
    	-command => sub {
    		$widget_output->delete( '0.0', 'end' );
    		Regex ();
    		$LabMessage = "Regex terminée";
    	},
    );
     
    # Clear
    my $bouton_clear = $cadre_gestion->Button(
    	-text    => "Clear",
    	-command => sub {
    		$widget_input->delete( '0.0', 'end' );
    		$widget_output->delete( '0.0', 'end' );
    		$LabMessage = "";
    	},
    );
     
     
    # Exit
    my $bouton_exit = $cadre_gestion->Button(
    	-text    => "Exit",
    	-command => [ \&fermer, ],
    );
     
    ####################################
    # Cadre pour les messages de service
    my $cadre_messages = $Wm->Frame( -background => $couleur_commune, );
     
    # Label qui affichera la Regex, en bas
    my $label_regex = $cadre_messages->Label(
      -textvariable => \$LabRegex,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    # Label qui affichera les messages, en bas
    my $label_message = $cadre_messages->Label(
      -textvariable => \$LabMessage,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    ####################################
    # Gestion de l'affichage des widgets
    #
    $cadre_messages->pack(qw / -side bottom -fill both -expand 0 /);
    $label_regex->pack(qw / -side left -fill both -expand 1 /);
    $label_message->pack(qw / -side left -fill both -expand 1 /);
     
    $widget_output->pack(qw / -side bottom -fill both -expand 1 /);
    $widget_input->pack(qw / -side bottom -fill both -expand 1 /);
     
    $cadre_gestion->pack(qw / -side right -fill both -expand 1 /);
     
    $LabelRegex->grid( $RegexSaisie, $bouton_start, $bouton_clear, $bouton_exit,
    	qw / -padx 2 -pady 5 -sticky nsew /
    );
     
    MainLoop;
     
    #############################################################################
     
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	#my $Pattern = $MotAvant.$Regex.$MotApres;
    	my $Pattern = $Regex;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = ($TexteInput =~ m/($Word $Regex $Word)/gx);
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
     
    sub fermer {
    	exit (0);
    }
     
    #########################################
    # Configuration des polices de caractères
    #
    sub configurer_tags {
    	my $widget_text = shift;
    	for my $police ( 12 .. 72 ) {
    		if ( $police % 2 == 0 ) {
    			$widget_text->tagConfigure(
    				"g$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'left',
    			);
    			$widget_text->tagConfigure(
    				"c$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'center',
    			);
    			$widget_text->tagConfigure(
    				"d$police",
    				-background => '#ABFAA3',
    				-font      => "{Simplified Arabic} $police {bold}",
    				-justify    => 'right',
    			);
    		}
    	}
    	return;
    }
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccentsDOS {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    [Edit 21:57] Le texte en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    DE L'AMITIÉ
     
    1. Considérant la conduite de la besogne d'un peintre, que j'ai, il m'a pris envie de l'ensuivre. Il choisit le plus bel endroit et milieu de chaque paroi, pour y loger un tableau élaboré de toute sa suffisance : Et le vide tout autour, il le remplit de crotesques, qui sont peintures fantasques, n'ayant grâce qu'en la variété et étrangeté. Que sont-ce ici aussi à la vérité que crotesques et corps monstrueux, rapiécés de divers membres, sans certaine figure, n'ayant ordre, suite, ni proportion que fortuite ?
     
    «Une femme belle de buste s'achève en poisson».
     
    2. Je vais bien jusques à ce second point, avec mon peintre : mais je demeure court en l'autre, et meilleure partie : Car ma suffisance ne va pas si avant, que d'oser entreprendre un tableau riche, poli et formé selon l'art. Je me suis avisé d'en emprunter un d'Estienne de la Boétie, qui honorera tout le reste de cette besogne. C'est un discours auquel il donna nom. La Servitude volontaire : Mais ceux qui l'ont ignoré, l'ont bien proprement depuis rebaptisé, Le Contre un. Il l'écrivit par manière d'essai, en sa première jeunesse, à l'honneur de la liberté contre les tyrans. Il court piéça ès mains des gens d'entendement, non sans bien grande et méritée recommandation : car il est gentil, et plein ce qu'il est possible. Si y a-il bien à dire, que ce ne soit le mieux qu'il pût faire : et si en l'âge que je l'ai connu plus avancé, il eût pris un tel dessein que le mien, de mettre par écrit ses fantaisies, nous verrions plusieurs choses rares, et qui nous approcheraient bien près de l'honneur de l'antiquité : Car notamment en cette partie des dons de nature, je n'en connais point qui lui soit comparable.
     
    3. Mais il n'est demeuré de lui que ce discours, encore par rencontre, et crois qu'il ne le vit onques depuis qu'il lui échappa : et quelques mémoires sur cet édit de Janvier fameux par nos guerres civiles, qui trouveront encore ailleurs peut-être leur place. C'est tout ce que j'ai pu recouvrer de ses reliques, Moi, qu'il laissa d'une si amoureuse recommandation, la mort entre les dents, par son testament héritier de sa bibliothèque et de ses papiers : outre le livret de ses œuvres que j'ai fait mettre en lumière. Et si suis obligé particulièrement à cette pièce, d'autant qu'elle a servi de moyen à notre première accointance. Car elle me fut montrée longue pièce avant que je l'eusse vu, et me donna la première connaissance de son nom, acheminant ainsi cette amitié, que nous avons nourrie, tant que Dieu a voulu, entre nous, si entière et si parfaite, que certainement il ne s'en lit guère de pareilles, et entre nos hommes il ne s'en voit aucune trace en usage. Il faut tant de rencontres à la bâtir, que c'est beaucoup si la fortune y arrive une fois en trois siècles.
     
    4. Il n'est rien à quoi il semble que nature nous ait plus acheminé qu'à la société : et dit Aristote que les bons législateurs ont eu plus de soin de l'amitié que de la justice. Or le dernier point de sa perfection est cetui-ci. Car en général toutes celles que la volupté ou le profit : le besoin public ou privé forge et nourrit : en sont d'autant moins belles et généreuses, et d'autant moins amitiés, qu'elles mêlent autre cause et but et fruit en l'amitié qu'elle-même. Ni ces quatre espèces anciennes : naturelle, sociale, hospitalière, vénérienne, particulièrement n'y conviennent, ni conjointement.
     
    5. Des enfants aux pères, c'est plutôt respect. L'amitié se nourrit de communication, qui ne peut se trouver entre eux, pour la trop grande disparité, et offenserait à l'aventure les devoirs de nature : Car ni toutes les secrètes pensées des pères ne se peuvent communiquer aux enfants, pour n'y engendrer une messéante privauté : ni les avertissements et corrections, qui est un des premiers offices d'amitié, ne se pourraient exercer des enfants aux pères. Il s'est trouvé des nations, où par usage les enfants tuaient leurs pères : et d'autres, où les pères tuaient leurs enfants, pour éviter l'empêchement qu'ils se peuvent quelquefois entreporter, et naturellement l'un dépend de la ruine de l'autre : Il s'est trouvé des philosophes dédaignant cette couture naturelle : témoin Aristippus : quand on le pressait de l'affection qu'il devait à ses enfants pour être sortis de lui, il se mit à cracher : disant que cela en était aussi bien sorti : que nous engendrions bien des poux et des vers. Et cet autre que Plutarque voulait induire à s'accorder avec son frère. Je n'en fais pas, dit-il, plus grand état, pour être sorti de même trou.
     
    6. C'est à la vérité un beau nom, et plein de dilection que le nom de frère, et à cette cause en fîmes-nous lui et moi notre alliance : Mais ce mélange de biens, ces partages, et que la richesse de l'un soit la pauvreté de l'autre, cela détrempe merveilleusement et relâche cette soudure fraternelle : Les frères ayant à conduire le progrès de leur avancement, en même sentier et même train, il est force qu'ils se heurtent et choquent souvent. Davantage, la correspondance et relation qui engendre ces vraies et parfaites amitiés, pourquoi se trouvera-t-elle en ceux-ci ? Le père et le fils peuvent être de complexion entièrement éloignée, et les frères aussi : C'est mon fils, c'est mon parent : mais c'est un homme farouche, un méchant, ou un sot.
     
    7. Et puis, à mesure que ce sont amitiés que la loi et l'obligation naturelle nous commande, il y a d'autant moins de notre choix et liberté volontaire : Et notre liberté volontaire n'a point de production qui soit plus proprement sienne, que celle de l'affection et amitié. Ce n'est pas que je n'aie essayé de ce côté-là, tout ce qui en peut être, Ayant eu le meilleur père qui fut onques, et le plus indulgent, jusques à son extrême vieillesse, et étant d'une famille fameuse de père en fils, et exemplaire en cette partie de la concorde fraternelle,
     
    «et étant moi-même connu pour l'affection paternelle que j'éprouve à l'égard de mes frères».
     
    8. D'y comparer l'affection envers les femmes, quoiqu'elle naisse de notre choix, on ne peut, ni la loger en ce rôle. Son feu, je le confesse,
     
    «et en effet elle ne nous est pas inconnue, la déesse qui aux soucis mélange une douce amertume»,
     
    est plus actif, plus cuisant, et plus âpre. Mais c'est un feu téméraire et volage, ondoyant et divers, feu de fièvre, sujet à accès et remises, et qui ne nous tient qu'à un coin. En l'amitié, c'est une chaleur générale et universelle, tempérée au demeurant et égale, une chaleur constante et rassise, toute douceur et polissure, qui n'a rien d'âpre et de poignant.
     
    9. Qui plus est en l'amour ce n'est qu'un désir forcené après ce qui nous fuit,
     
    «Comme le chasseur suit le lièvre dans le froid, dans la chaleur, sur la montagne, sur le rivage, mais n'en fait plus cas dès qu'il est pris, et ne presse le pas qu'à la poursuite de ce qui s'enfuit.».
     
    10. Aussitôt qu'il entre aux termes de l'amitié, c'est-à-dire en la convenance des volontés, il s'évanouit et s'alanguit : La jouissance le perd, comme ayant la fin corporelle et sujette à satiété. L'amitié au rebours, est jouie à mesure qu'elle est désirée, ne s'élève, se nourrit, ni ne prend accroissance qu'en la jouissance, comme étant spirituelle, et l'âme s'affinant par l'usage. Sous cette parfaite amitié, ces affections volages ont autrefois trouvé place chez moi, afin que je ne parle de lui, qui n'en confesse que trop par ces vers. Ainsi ces deux passions sont entrées chez moi en connaissance l'une de l'autre, mais en comparaison jamais : La première maintenant sa route d'un vol hautain et superbe, et regardant dédaigneusement cette-ci passer ses pointes bien loin au-dessous d'elle.

    Un gros MERCI déjà :

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Pour info je pense avoir (entre autre) un pb de codification avec les caractères accentués dans le ScrolledText et leur reconnaissance dans la regex, même avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $TexteInput = encode("iso-8859-16", $TexteInput);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	$TexteInput = encode("iso-8859-16", $TexteInput);
    	my $Pattern = $Regex;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = ($TexteInput =~ m/($Word$Regex$Word)/gx);
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
    Bon je recherche...

    [Edit 06:56] Correction, non c'est bien la ponctuation qui cause le plus de soucis, Ex :

  5. #5
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bon j'avance, mais avec des quantificateurs gourmands, et ce n'est pas tip top !
    Pas facile (pour moi) de prendre en compte tous les cas de ponctuation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    my $Point  = qr/(?:\s*\W*\s*){0,}/;
    my $Word   = qr/\s*(?:\w*\s*){0,5}/;
     
    ...
     
    sub Regex {
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = qr/$Word$Point$Regex$Point$Word/;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = ($TexteInput =~ m/($Pattern)/gx);
    	foreach my $Ligne ( @array ) {
    		$widget_output->insert( 'end', ++$i.": ".$Ligne."\n" );
    	}
    }
    J'obtiens de meilleurs temps de réponse dans le Addon Firefox où les mots Avant et Après ne sont pas gérés en regex mais à partir d'un intervalle autour de l'expression recherchée.
    Je le passe en résolu mais si vous avez mieux, je suis preneur ceci dit ne vous y cassez pas la tête

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Suggestion : en réalité tu ne souhaites pas particulièrement avoir un nombre de mots autour du pattern, tu souhaites plutôt avoir un "contexte" de longueur à peu près constante, et tu souhaiterais qu'il ne s'arrête pas au milieu d'un mot, n'est-ce pas ?
    Dans ce cas la regex suivante est plus appropriée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/(\b.{0,40}$Regex.{0,40}\b)/
    --
    Jedaï

  7. #7
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    SUPER Jedai
    C'est exactement ce qu'il me faut !

    NB : La recherche s'effectue en 2 temps :
    1er : un mot ou une regex simple qui va généré dans output les lignes trouvées avec leurs contextes
    2ème : Copié d'une partie d'un contexte collé dans Regex, nouvelle recherche qui va générer une seule réponse et donc l'affichage dans output du texte sélectionné avec le pattern en surbrillance, le tout répété dans input

    NB : Si on est meilleur que moi en regex, on peut bien sûr d'emblée entrer une vraie regex...

    Je colle la dernière mouture :
    [Edit 13-18:27] Modification des surlignages Input/output
    Regex.pl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use Tk;
    use Tk::LabFrame;
    use Tk::ROText;
     
    my $RepBas     = 'E:/_APPLI/Regex';
    my $LabMessage = "";
    my $LabRegex   = "";
    #my $words = qr/\s*(?:\w+\s+){0,5}/;
     
    ActiverAccentsDOS();
     
    my $fen  = MainWindow->new;
    my $width = $fen->screenwidth();
    my $height = $fen->screenheight();
    $fen->destroy();
     
    # Creation du widget principal
    my $Wm = MainWindow->new(
    	-width			=> $width,
    	-height			=> $height,
    	-title      => "Regex",
      -background => 'white',
    );
     
    $width = $Wm->screenwidth*(4/5);
    $height = $Wm->screenheight*(4/5);
    $Wm->configure(-height=>$height, -width=>$width, -title=>"Recherche dans un texte");
    $Wm->geometry( $width ."x". $height );
    $Wm->MoveToplevelWindow (100,100);
    #$Wm->overrideredirect(1);
    #$Wm->packPropagate(0);
    #$Wm->raise();
     
    ###############################
    # Scrolled qui affiche le texte
    my $widget_input = $Wm->Scrolled(
      'Text',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 14 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFAA3',
    );
     
    my $widget_output = $Wm->Scrolled(
      'ROText',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 14 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFA30',
    );
     
    # Cadre des configurations
    my $couleur_commune = '#E0F0FF';
     
    # Cadre Gestion
    my $cadre_gestion = $Wm->LabFrame(
      -label      => 'Gestion',
      -background => $couleur_commune,
      -font       => '{Simplified Arabic} 10 {bold}',
    );
    configurer_tags($widget_input);
    configurer_tags($widget_output);
     
    # Début Input
    my $bouton_deb = $cadre_gestion->Button(
    	-text    => "Début Input",
    	-command => sub {
    		$widget_input->see( '0.0' );
    	},
    );
     
    # Regex
    my $Regex = "";
    my $LabelRegex = $cadre_gestion->Label(
    	-text => "Regex",
    	-font => '{Simplified Arabic} 10 {bold}',
    );
     
    my $RegexSaisie = $cadre_gestion->Entry(
    	-width				=> 100,
    	-justify			=> 'left',
    	-textvariable	=> \$Regex,
    	-font					=> '{Simplified Arabic} 10 {bold}',
    );
     
    # Start
    my $bouton_start = $cadre_gestion->Button(
    	-text    => "Start",
    	-command => sub {
    		$widget_output->delete( '0.0', 'end' );
    		Regex ();
    		$LabMessage = "Regex terminée";
    	},
    );
     
    # Clear Input
    my $bouton_clearInput = $cadre_gestion->Button(
    	-text    => "Clear Input",
    	-command => sub {
    		$widget_input->delete( '0.0', 'end' );
    		$LabRegex = "";
    		$LabMessage = "";
    	},
    );
     
    # Clear Output
    my $bouton_clearOutput = $cadre_gestion->Button(
    	-text    => "Clear Output",
    	-command => sub {
    		$widget_output->delete( '0.0', 'end' );
    		$LabRegex = "";
    		$LabMessage = "";
    	},
    );
     
    # Exit
    my $bouton_exit = $cadre_gestion->Button(
    	-text    => "Exit",
    	-command => [ \&fermer, ],
    );
     
    ####################################
    # Cadre pour les messages de service
    my $cadre_messages = $Wm->Frame( -background => $couleur_commune, );
     
    # Label qui affichera la Regex, en bas
    my $label_regex = $cadre_messages->Label(
      -textvariable => \$LabRegex,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    # Label qui affichera les messages, en bas
    my $label_message = $cadre_messages->Label(
      -textvariable => \$LabMessage,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    ####################################
    # Gestion de l'affichage des widgets
    #
    $cadre_messages->pack(qw / -side bottom -fill both -expand 0 /);
    $label_regex->pack(qw / -side left -fill both -expand 1 /);
    $label_message->pack(qw / -side left -fill both -expand 1 /);
     
    $widget_output->pack(qw / -side bottom -fill both -expand 1 /);
    $widget_input->pack(qw / -side bottom -fill both -expand 1 /);
     
    $cadre_gestion->pack(qw / -side right -fill both -expand 1 /);
     
    $bouton_deb->grid( $LabelRegex, $RegexSaisie, $bouton_start, $bouton_clearInput, $bouton_clearOutput, $bouton_exit,
    	qw / -padx 2 -pady 5 -sticky nsew /
    );
     
    MainLoop;
     
    #############################################################################
     
    sub Regex {
    	if ( !$Regex ) {
    		$LabRegex   = "Regex vide !";
    		$LabMessage = "Regex vide !";
    		print "\a\a";
    		return;
    	}
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $Regex;
    	$Pattern =~ s/ /\\ /go;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @Array = ($TexteInput =~ m/(\b.{0,40}$Pattern.{0,40}\b)/gx);
    	my $Nb = @Array;
    	if ($Nb == 1){
    		my @NewArray = split /$Pattern/, $TexteInput;
    		my @ChainePref = ( $Array[0] =~ m/($Pattern)/gx);
    		$widget_output->insert( 'end', $NewArray[0]." " );
    		$widget_output->see( 'end' );
    		$widget_output->update;
    		$widget_output->tagAdd( 'MARK', 'end -2 chars' );
    		my @Mark = $widget_output->tagRanges( 'MARK' );
    		my ($SelA, $SelB) = split /\./, $Mark[0];
    		$SelB = $SelB + length($ChainePref[0]);
    		my $SelLast = $SelA.".".$SelB;
    		$widget_input->see( $Mark[0] );
    		$widget_output->insert( 'end', $ChainePref[0], "g14");
     
    		$widget_input->tagAdd( 'g14', $Mark[0], $SelLast);
     
    		$widget_output->insert( 'end', $NewArray[1] );
    		$LabRegex = $Pattern;
    	} else {
    		foreach my $Ligne ( @Array ) {
    			$widget_output->insert( 'end', ++$i .": ".$Ligne."\n" );
    		}
    	}
    }
     
    sub fermer {
    	exit (0);
    }
     
    #########################################
    # Configuration des polices de caractères
    #
    sub configurer_tags {
    	my $widget_text = shift;
    	for my $police ( 12 .. 72 ) {
    		if ( $police % 2 == 0 ) {
    			$widget_text->tagConfigure(
    				"g$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'left',
    			);
    			$widget_text->tagConfigure(
    				"c$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'center',
    			);
    			$widget_text->tagConfigure(
    				"d$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'right',
    			);
    		}
    	}
    	return;
    }
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccentsDOS {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89 	
     
    =pod
    3.end	The newline at the end of line 3.
    1.0 + 3 chars	Three characters past the start of line 1.
    2.end -1 chars	The last character before the new line in line 2.
    end -1 chars	The newline that Tk always adds at the end of the text.
    end -2 chars	The actual last character of the text.
    end -1 lines	The start of the last actual line of text.
    2.2 + 2 lines	The third character (index 2) of the fourth line of text.
    2.5 linestart	The first character of line 2.
    2.5 lineend	The position of the newline at the end of line 2.
    2.5 wordstart	The first character of the word containing the character at index 2.5.
    2.5 wordend	The first character just past the last character of the word containing index 2.5.
    A parfaire, bien sûr... quelques tests de contrôle, couleurs...
    Pour moi ça comble mon besoin :
    1ère recherche, j'ai la liste des lignes où le pattern apparaît, je fais un copier/coller étendu de celui qui me convient dans la regex
    2ème recherche j'ai le texte avec en surbrillance la chaîne recherchée

    Encore MERCI Jedai ! et djibril

    Je supprime les images devenues inutiles, et laisse les suivantes quelques semaines :

  8. #8
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Plus possible de modifier la version ci-dessus
    Je colle la dernière version 17/07/14 pour les personnes intéressées...
    NB : On peut mettre plusieurs textes à la suite, par exemples les 3 livres des Essais.

    [EDIT 08:25] Plus de modif
    Regex.ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # ATTENTION SAUVEGARDER EN UTF8 NO BOM
    [GLOBAL]
    confirm: OUI
    curfile: E:/_DOC/DocTxt/Montaigne_1.txt
     
    [REGEX]
    regex: Regex utiles
         : \s{0,1}
         : \s{0,1}
         : \s*(?:\w+\s+){0,9}
         : \s*(?:\w+\s+){0,9},{0,1}
         : \s*(?:\w+\s){1,4}
         : \s*(?:\w+[\(\)\b|\s\?|\.|,|:|']+){1,50}
     
    [FIN]

    Regex.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use encoding 'utf8';
    use Tk;
    use Tk::Dialog;
    use Tk::Photo;
    use Tk::LabFrame;
    use Tk::ROText;
    use File::Spec;														# Gestion des noms des chemins sous tous les OS
    use Config::Std;													# Lecture/ecriture d'un fichier .ini
     
    my $RepBase    = 'E:/_APPLI/Regex/';
    my $Bulb       = 'E:/_APPLI/Regex/Images/Bulb.gif';
    my $Plus       = 'E:/_APPLI/Regex/Images/Plus.gif';
    my $Moins      = 'E:/_APPLI/Regex/Images/Moins.gif';
    my $Insert     = 'E:/_APPLI/Regex/Images/Insert.gif';
    my $TexteInput = "";
    my $LabMessage = "";
    my $LabRegex   = "";
    my $Reponse    = "";
    my $Regex      = "";
    my $RegEdit    = "";
    my $VarReg     = "";
    my $NbTrouve   = 0;
    my $FlagSave   = 0;
     
    # Lecture du fichier de configuration
    my $fichier_config = File::Spec->catfile( $RepBase, 'Regex.ini' );
    my %config;
    if ( -e $fichier_config ) {
     	read_config $fichier_config => %config;
    }
    else {
     	%config = (
       	'GLOBAL' => {
       		confirm	=> 'OUI',
       		curfile => '',
       	},
       	'REGEX' => {
       		'regex' => '.ini ABSENT !'
    		},
     	);
    }
    my $Filepath = $config{GLOBAL}{curfile};
    my $LabFile  = $Filepath;
    my @LesRegex = split (/\n/,$config{REGEX}{regex});
    $Reponse  = "OUI" if ( $config{GLOBAL}{confirm} eq 'NON');
     
    ActiverAccentsDOS();
     
    my $fen  = MainWindow->new;
    my $width = $fen->screenwidth();
    my $height = $fen->screenheight();
    $fen->destroy();
     
    # Creation du widget principal
    my $Wm = MainWindow->new(
    	-width			=> $width,
    	-height			=> $height,
    	-title      => "Regex",
      -background => 'white',
    );
     
    $width = int($Wm->screenwidth*(8/9));
    $height = int($Wm->screenheight*(5/6));
    $Wm->configure(-height=>$height, -width=>$width, -title=>"Recherche dans un texte");
    $Wm->geometry( $width ."x". $height );
    #$Wm->MoveToplevelWindow (100,100);
    #$Wm->overrideredirect(1);
    #$Wm->packPropagate(0);
    #$Wm->raise();
     
    # Configurations
    my $couleur_commune = '#E0F0FF';
     
    # Cadre Gestion
    my $cadre_gestion = $Wm->LabFrame(
      -label      => 'Gestion',
      -background => $couleur_commune,
      -font       => '{Simplified Arabic} 10 {bold}',
    );
     
    ###############################
    # Scrolled qui affiche le texte
    my $widget_input = $Wm->Scrolled(
      'Text',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 14 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFAA3',
    );
     
    my $widget_output = $Wm->Scrolled(
      'ROText',
      -scrollbars => 'e',
      -takefocus  => 0,
      -font       => '{Simplified Arabic} 14 {bold}',
      -height     => '6',
      -wrap       => 'word',
      -relief     => 'groove',
      -background => '#ABFA30',
    );
     
    configurer_tags($widget_input);
    configurer_tags($widget_output);
     
    #########################################################
    # 1er ordre non respecté pour visibilité dans Regex Moins
     
    ##############
    # Regex Utiles
    #my $Affichage = "Regex";
    my $option_regex = $cadre_gestion->Optionmenu(
    #	-textvariable => \$Affichage,
    	-variable     => \$VarReg,
    	-options      => \@LesRegex,
    	-command      => sub {
    		$RegEdit = $VarReg;
    	},
    );
     
    # Sauvegarde du fichier de configuration
    my $bouton_save = $cadre_gestion->Button(
    	-text    => "Save",
    	-command => sub {
    		if ( ! $FlagSave ) {
    			$LabMessage = "La configuration des regex n'a pas été modifiée, Pas de sauvegarde !";
    			print "\a";
    		} else {
    			confirmation($Wm, "Faut-il sauvegarder la configuration ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    			if ($Reponse eq "OUI") {
    				save_config( $fichier_config, \%config );
    				$LabMessage = "Fichier $fichier_config sauvegardé";
    			} else {
    				$LabMessage = "Configuration non modifiée !";
    			}
    		}
    	},
    );
     
    #############
    # Regex Moins
    $Moins = $Wm->Photo( -file => $Moins );
    my $bouton_regMoins = $cadre_gestion->Button(
    	-image    => $Moins,
    	-text    => "  -  ",
    	-command => sub {
    		confirmation($Wm, "Faut-il supprimer la regex  $RegEdit  de la liste d'option ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			#push @LesRegex, $RegEdit;
    			my @RegTemp;
    			foreach my $Reg ( @LesRegex ) {
    				if ( $Reg ne $VarReg ) {
    					push @RegTemp, $Reg;
    				}
    			}
    			@LesRegex = @RegTemp;
    			$option_regex->configure(
    				-options      => \@LesRegex,
    			);
    			$FlagSave++;
    			$LabMessage = "Regex  $RegEdit  supprimée !";
    		} else {
    			$LabMessage = "Liste des regex non modifiée !";
    		}
    	},
    );
     
    # Regex Plus
    $Plus = $Wm->Photo( -file => $Plus );
    my $bouton_regPlus = $cadre_gestion->Button(
    	-image    => $Plus,
    	#-text    => "  +  ",
    	-command => sub {
    		confirmation($Wm, "Faut-il ajouter la regex  $RegEdit  à la liste d'option ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			push @LesRegex, $RegEdit;
    			$option_regex->configure(
    				-options      => \@LesRegex,
    			);
    			$FlagSave++;
    			$LabMessage = "Regex  $RegEdit  ajoutée !";
    		} else {
    			$LabMessage = "Liste des regex non modifiée !";
    		}
    	},
    );
     
    # Regex Edit
    my $RegexEdit = $cadre_gestion->Entry(
    	-width				=> 40,
    	-justify			=> 'left',
    	-textvariable	=> \$RegEdit,
    	-font					=> '{Simplified Arabic} 10 {bold}',
    );
     
    # Regex Insert
    $Insert = $Wm->Photo( -file => $Insert );
    my $bouton_regInsert = $cadre_gestion->Button(
    	#-text    => "  >  ",
    	-image    => $Insert,
    	-command => sub {
    		confirmation($Wm, "Faut-il insérer  $RegEdit  à la Regex ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			$Regex = $Regex.$VarReg;
    			$LabMessage = "Regex modifiée !";
    		} else {
    			$LabMessage = "Modification de la Regex abandonnée !";
    		}
    	},
    );
     
    # Choix Fichier
    my $bouton_file = $cadre_gestion->Button(
    	-text    => "Fichier",
    	-command => sub {
    		get_file();
    		$LabFile = $Filepath;
    		$FlagSave ++;
    	},
    );
     
    # Load du fichier dans input
    my $bouton_load = $cadre_gestion->Button(
    	-text    => "Load",
    	-command => sub {
    		load_file ();
    	},
    );
     
    # Début Input
    my $bouton_deb = $cadre_gestion->Button(
    	-text    => "Début Input",
    	-command => sub {
    		$widget_input->see( '0.0' );
    	},
    );
     
    # Regex
    my $LabelRegex = $cadre_gestion->Label(
    	-text => "Regex",
    	-font => '{Simplified Arabic} 10 {bold}',
    );
     
    my $RegexSaisie = $cadre_gestion->Entry(
    	-width				=> 60,
    	-justify			=> 'left',
    	-textvariable	=> \$Regex,
    	-font					=> '{Simplified Arabic} 10 {bold}',
    );
     
    # Start
    my $bouton_start = $cadre_gestion->Button(
    	-text    => "Start Regex",
    	-command => sub {
    		if ( ! $TexteInput ) {
    			$LabMessage = "Input est vide !!!";
    			print "\a\a";
    			return
    		}
    		$NbTrouve   = 0;
    		$LabMessage = "Recherche en cours...";
    		$widget_output->delete( '0.0', 'end' );
    		Regex ();
    		$LabMessage = "Recherche terminée, Trouvé : $NbTrouve";
    	},
    );
     
    # Clear Input
    my $bouton_clearInput = $cadre_gestion->Button(
    	-text    => "Clear Input",
    	-command => sub {
    		if ($TexteInput) {
    			confirmation($Wm, "Faut-il effacer le contenu de Input ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    			if ($Reponse eq "OUI") {
    				$widget_input->delete( '0.0', 'end' );
    				$LabRegex = "";
    				$TexteInput = "";
    				$LabMessage = "Contenu de Input effacé !";
    			} else {
    				$LabMessage = "Contenu de Input conservé !";
    			}
    		} else {
    			$LabMessage = "Input déjà effacé !";
    			print "\a";
    		}
    	},
    );
     
    # Clear Tags Input
    $Bulb = $Wm->Photo( -file => $Bulb );
    my $bouton_clearTagInput = $cadre_gestion->Button(
    	-image    => $Bulb,
    	#-text    => "SurB",
    	-command  => sub {
    		if ($TexteInput) {
    			confirmation($Wm, "Faut-il effacer le surlignement dans Input ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    			if ($Reponse eq "OUI") {
    				$widget_input->tagDelete( 'g14' );
    				$LabMessage = "Surbrillances dans Input effacées !";
    			} else {
    				$LabMessage = "Surbrillances dans Input conservées !";
    			}
    		}
    		configurer_tags($widget_input);
    	},
    );
     
    # Clear Output
    my $bouton_clearOutput = $cadre_gestion->Button(
    	-text    => "Clear Output",
    	-command => sub {
    		confirmation($Wm, "Faut-il effacer le contenu de Output ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			$widget_output->delete( '0.0', 'end' );
    			$LabRegex = "";
    			$LabMessage = "Contenu de Output effacé !";
    		} else {
    			$LabMessage = "Contenu de Output conservé !";
    		}
    	},
    );
     
    # Exit
    my $bouton_exit = $cadre_gestion->Button(
    	-text    => "Exit",
    	-command => [ \&fermer, ],
    );
     
    ####################################
    # Cadre pour les messages de service
    my $cadre_messages = $Wm->Frame( -background => $couleur_commune, );
     
    # Label qui affichera le répertoire courant
    my $label_repertoire = $cadre_messages->Label(
      -textvariable => \$LabFile,
      -width => 15,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    # Label qui affichera la Regex, en bas
    my $label_regex = $cadre_messages->Label(
      -textvariable => \$LabRegex,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    # Label qui affichera les messages, en bas
    my $label_message = $cadre_messages->Label(
      -textvariable => \$LabMessage,
      -background  => '#FFE0D0',
      -relief      => 'groove',
    );
     
    ####################################
    # Gestion de l'affichage des widgets
    #
    $cadre_messages->pack(qw / -side bottom -fill both -expand 0 /);
    $label_repertoire->pack(qw / -side left -fill both -expand 1 /);
    $label_regex->pack(qw / -side left -fill both -expand 1 /);
    $label_message->pack(qw / -side left -fill both -expand 1 /);
     
    $widget_output->pack(qw / -side bottom -fill both -expand 1 /);
    $widget_input->pack(qw / -side bottom -fill both -expand 1 /);
     
    $cadre_gestion->pack(qw / -side right -fill both -expand 1 /);
     
    $bouton_save->grid( $bouton_regMoins, $option_regex, $bouton_regPlus, $RegexEdit,
    										$bouton_regInsert, $bouton_file, $bouton_load, $bouton_deb,
    										$LabelRegex, $RegexSaisie, $bouton_start, $bouton_clearInput,
    										$bouton_clearTagInput, $bouton_clearOutput, $bouton_exit,
    	qw / -padx 2 -pady 5 -sticky nsew /
    );
     
    # Centrer la fenêtre 
    centrer_widget($Wm);
     
    # Invalidation fermeture -> obligation de passer par exit
    $Wm->protocol( "WM_DELETE_WINDOW", sub {
    		fermer();
    	}
    );
     
    MainLoop;
     
    #############################################################################
     
    sub Regex {
    	if ( !$Regex ) {
    		$LabRegex   = "Regex vide !";
    		$LabMessage = "Regex vide !";
    		print "\a\a";
    		return;
    	}
    	$TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $Regex;
    	$Pattern =~ s/ /\\ /go;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @Array = ($TexteInput =~ m/(\b.{0,40}$Pattern.{0,40}\b)/gx);
    	$NbTrouve = @Array;
    	if ($NbTrouve == 1){
    		my @NewArray = split /$Pattern/, $TexteInput;
    		my @ChainePref = ( $Array[0] =~ m/($Pattern)/gx);
    		$widget_output->insert( 'end', $NewArray[0] );
    		$widget_output->see( 'end' );
    		$widget_output->update;
    		$widget_output->tagAdd( 'MARK', 'end -1 chars' );
    		my @Mark = $widget_output->tagRanges( 'MARK' );
    		my ($SelA, $SelB) = split /\./, $Mark[0];
    		$SelB = $SelB + length($ChainePref[0]);
    		my $SelLast = $SelA.".".$SelB;
    		$widget_input->see( $Mark[0] );
    		$widget_output->insert( 'end', $ChainePref[0], "g14");
    																													# pb tagAdd sur tag déjà effacé !
    		$widget_input->tagAdd( 'g14', $Mark[0], $SelLast);
    		$widget_input->update;
     
    		$widget_output->insert( 'end', $NewArray[1] );
    		$LabRegex = $Pattern;
    	} else {
    		foreach my $Ligne ( @Array ) {
    			$widget_output->insert( 'end', ++$i .": ".$Ligne."\n" );
    		}
    	}
    }
     
    #############################################################################
    # Fermer l'appli
    #
    sub fermer {
    	if ($FlagSave) {
    		confirmation($Wm, "Faut-il sauvegarder la configuration ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			save_config( $fichier_config, \%config );
    			$LabMessage = "Fichier $fichier_config sauvegardé";
    		} else {
    			$LabMessage = "Configuration non modifiée !";
    		}
    	}
    	exit (0);
    }
     
    ########################
    # Recherche d'un fichier
    #
    sub get_file {
      my @types =
           (["Log files", [qw/.txt .log/]],
            ["All files",        '*'],
           );
      $Filepath = $Wm->getOpenFile(-filetypes => \@types) or return();
      $LabMessage = "Fichier en cours : $Filepath";
      return($Filepath);
    }
     
    #########################
    # Chargement d'un fichier
    #
    sub load_file {
    	my $IN_Fic  = $Filepath;
    	if ( ! $Filepath ){
    		$LabMessage = "ERREUR : Absence de fichier à charger";
    		print "\a";
    		return;
    	}
    	unless (open (IN, "<", $IN_Fic)) {
    		$LabMessage = "ERREUR : Impossible d'ouvrir $IN_Fic - $! - $@\n";
    		$Wm->Label->update();
    		return;
    	}
    	if ($TexteInput) {
    		confirmation($Wm, "Faut-il conserver le texte présent, et donc ajouter celui du fichier $Filepath à la suite ?") if ( $config{GLOBAL}{confirm} eq 'OUI');
    		if ($Reponse eq "OUI") {
    			$widget_input->insert( 'end', "\n= = = = = = = = = = = = = = = = = = = = =\n\n", "c28");
    			$LabMessage = "Ajout de $Filepath en cours...";
    		} else {
    			$widget_input->delete( '1.0', 'end' );
    			$LabMessage = "Chargement $Filepath en cours...";
    		}
    	}
    	while ( my $Ligne = <IN> ) {
    		$widget_input->insert( 'end', $Ligne );
    	}
    	$widget_input->update;
    	$LabMessage = "$Filepath chargé !";
    	$TexteInput = $widget_input->get( '1.0', 'end' );
    	close $IN_Fic;
    }
     
    ######################
    # Fenêtre Confirmation
    #
    sub confirmation {
      my $widget   = shift;
      my $Question = shift;
      my $dialog = $widget->Dialog(
        -title      => 'Confirmation',
        -buttons    => [ 'OUI', 'NON' ],
        -background => '#FFE0D0',
        -text       => $Question,
      );
      # Configuration des boutons
      $dialog->Subwidget("B_OUI")->configure( -background => '#68C963', );
      $dialog->Subwidget("B_NON")->configure( -background => '#CF0063', );
      $Reponse = $dialog->Show();
    }
     
    #########################################
    # Configuration des polices de caractères
    #
    sub configurer_tags {
    	my $widget_text = shift;
    	for my $police ( 12 .. 72 ) {
    		if ( $police % 2 == 0 ) {
    			$widget_text->tagConfigure(
    				"g$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'left',
    			);
    			$widget_text->tagConfigure(
    				"c$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'center',
    			);
    			$widget_text->tagConfigure(
    				"d$police",
    				-background => '#ABFAA3',
    				-foreground => '#FF0000',
    				-font       => "{Simplified Arabic} $police {bold}",
    				-justify    => 'right',
    			);
    		}
    	}
    	return;
    }
     
    ##########################
    # Sauvegarde configuration
    #
    sub save_config {
    	my ( $fichier, $ref_config ) = @_;
    	$config{GLOBAL}{curfile} = $Filepath;
    	$config{REGEX}{regex} = join("\n",@LesRegex);
    	write_config %{$ref_config}, $fichier;
    	$FlagSave = 0;
    	return;
    }
     
    #===========================================================================================
    # But : Centrer un widget automatiquement
    # http://perl.developpez.com/faq/tk/?page=Les-Fenetres-de-premier-niveau-MainWindow-Toplevel
    #===========================================================================================
    sub centrer_widget { 
      my ( $widget ) = @_; 
     
      # Height and width of the screen 
      my $largeur_ecran = $widget->screenwidth(); 
      my $hauteur_ecran = $widget->screenheight(); 
     
      # update le widget pour récupérer les vraies dimensions 
      $widget->update; 
      my $largeur_widget = $widget->width; 
      my $hauteur_widget = $widget->height; 
     
      # On centre le widget en fonction de la taille de l'écran 
      my $nouvelle_largeur  = int( ( $largeur_ecran - $largeur_widget ) / 2 ); 
      my $nouvelle_hauteur  = int( ( $hauteur_ecran - $hauteur_widget ) / 2 ); 
      $widget->geometry($largeur_widget . "x" . $hauteur_widget  
      . "+$nouvelle_largeur+$nouvelle_hauteur"); 
     
      $widget->update; 
     
      return; 
    }
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccentsDOS {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    =pod
    Sinon :
    ü 	\x81 	à 	\x85 	è 	\x8A
    é 	\x82 	ç 	\x87 	ï 	\x8B
    â 	\x83 	ê 	\x88 	î 	\x8C
    ä 	\x84 	ë 	\x89 	
     
    =pod
    Widget TEXT :
    3.end	The newline at the end of line 3.
    1.0 + 3 chars	Three characters past the start of line 1.
    2.end -1 chars	The last character before the new line in line 2.
    end -1 chars	The newline that Tk always adds at the end of the text.
    end -2 chars	The actual last character of the text.
    end -1 lines	The start of the last actual line of text.
    2.2 + 2 lines	The third character (index 2) of the fourth line of text.
    2.5 linestart	The first character of line 2.
    2.5 lineend	The position of the newline at the end of line 2.
    2.5 wordstart	The first character of the word containing the character at index 2.5.
    2.5 wordend	The first character just past the last character of the word containing index 2.5.
     
    #my $words = qr/\s*(?:\w+\s+){0,5}/;
    #$TexteInput =~ m/(\b.{0,40}$Pattern.{0,40}\b)/gx);

  9. #9
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut Regex séparateur de mots
    Bonjour,
    J'enlève qq instant pour une question similaire sur la regex (séparateurs de mot) :

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cette\s*(?:\w+[\(\)\b|\s\?|\.|,|:|']+){1,50}cherche
    Je matche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cette considération n'a rien de commun avec les offices de l'amitié qu'ils me doivent. Et en l'accointance domestique que dressent avec moi ceux qui me servent, j'en fais de même. Et m'enquiers peu d'un laquais s'il est chaste. Je cherch
    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    29. Aux confédérations qui ne tiennent que par un bout on n'a à pourvoir qu'aux imperfections qui particulièrement intéressent ce bout-là. Il ne peut chaloir de quelle religion soit mon médecin et mon avocat. Cette considération n'a rien de commun avec les offices de l'amitié qu'ils me doivent. Et en l'accointance domestique que dressent avec moi ceux qui me servent, j'en fais de même. Et m'enquiers peu d'un laquais s'il est chaste. Je cherche s'il est diligent. Et ne crains pas tant un muletier joueur qu'imbécile : ni un cuisinier jureur qu'ignorant. Je ne me mêle pas de dire ce qu'il faut faire au monde, d'autres assez s'en mêlent, mais ce que j'y fais.
    Je cherche à écrire la regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \s*(?:\w+[\(\)\b|\s\?|\.|,|:|']+){1,50}
    uniquement en prenant le séparateur de mot \b, (sans préciser les autres caractères [\(\)\b|\s\?|\.|,|']+

    Il me semblait que ceci suffisait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cette\s*(?:\w+[\b]+){1,50}cherche
    Ben je bloque
    Pouvez-vous m'aider SVP ?

    PS : Si vous avez du temps, car c'est juste pour comprendre !
    MERCI d'avance !

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne suis pas certain de ce que tu cherches à faire, mais \b est une assertion de taille zéro, elle ne matche donc pas de caractère (il est donc inutile de le quantifier).
    Peut-être souhaiterais tu utiliser cette regexp : /Cette\s*(?:\w+\W+){1,50}cherche/ ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    SUPER MERCI Philou67430 !
    C'est mieux quand on sait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couper une chaine avant et apres un mot
    Par lelectronique.com dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2011, 14h36
  2. Réponses: 3
    Dernier message: 05/11/2006, 20h57
  3. Réponses: 1
    Dernier message: 10/09/2006, 13h23
  4. extraire que les mots avant une virgule
    Par lionski dans le forum Access
    Réponses: 6
    Dernier message: 03/08/2006, 16h19
  5. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo