Home > Enterprise >  Is it possible to replace characters only within selected a group?
Is it possible to replace characters only within selected a group?

Time:06-12

Consider: word1.word2.worda-wordb-wordc.ext

Is there a regular expression capture and replace string that can be used to obtain as result: worda wordb wordc using perl compatible regular expressions?

I know you can capture the group of words a,b,c with: /. ?\.. ?\.(. ?)\.ext$/$1/, but I don't know how to additionally replace dash (-) characters by space ( ) characters only within that group.

CodePudding user response:

You could replace - with spaces using s/\-/ /g

my $string = "word1.word2.worda-wordb-wordc.ext";

$string =~ s/. ?\.. ?\.(. ?)\.ext$/$1/;
$string =~ s/\-/ /g;

print($string);  # worda wordb wordc

CodePudding user response:

Can run another regex in the replacement side, under /e modifier

$string =~ s{. ?\.. ?\.(. ?)\.ext$}{ $1 =~ s/-/ /gr }e;

The regex inside the replacement side has to use /r modifier since $1 can't be changed.

CodePudding user response:

Desired result can be achieved in several ways:

  1. utilizing regex as in your example
  2. split the string on .
    • take 3-rd part
    • replace - with

Demonstration code provided bellow

  • regex method is commented out
  • split method used by code
use strict;
use warnings;
use feature 'say';

my $str = 'word1.word2.worda-wordb-wordc.ext';

#$str =~ s!\w \.\w \.(.*?)\.ext!$1 =~ s/-/ /gr!e;
$str = (split('\.',$str))[2] =~ s/-/ /gr;

say $str;

CodePudding user response:

Using match join in perl:

my $str = 'word1.word2.worda-wordb-wordc.ext';

print join (' ', $str =~ /[^-.] (?=-)|(?<=-)[^-.] /g) . "\n";

Output:

worda wordb wordc

RegEx Demo

RegEx Details:

  • [^-.] (?=-): Match 1 of any character that is not - or . when it is followed by a -
  • |: OR
  • (?<=-)[^-.] : Match 1 of any character that is not - or . when it is preceded by a -
  • Related