I agree that a two-step approach (i.e., match for name_a, then delete unwanted params) is best. However, here's an 'advanced' (read: unnecessarily complex) way that doesn't use the /e modifier:
>perl -wMstrict -le "my @txt = ( '{name_b param_v=\"wh\"}', '{name_a param_x=\"abc\" param_a=\"fsd\" param_y=\"def\"}', '{name_z param_sd=\"zka\" param_s=\"df\"}', '{name_a param_y=\"wtf\" param_z=\"kro\" param_c=\"ptz\" param_ch=\ +"www\"}', '{name_a param_sd=\"zka\" param_y=\"wtf\"}', ); ;; my $not_p_xy = qr{ (?! param_ [xy] \b) }xms; my $not_sp_param = qr{ (?! \s+ $not_p_xy param_ \w+) . }xms; ;; for my $s (@txt) { print qq{'$s'}; $s =~ s( (?: \G (?<! \A) | \A {name_a) $not_sp_param* \K \s+ $not_p_xy \w+ = \" [^^\"]* \" ) ()xmsg; print qq{'$s' \n}; } " '{name_b param_v="wh"}' '{name_b param_v="wh"}' '{name_a param_x="abc" param_a="fsd" param_y="def"}' '{name_a param_x="abc" param_y="def"}' '{name_z param_sd="zka" param_s="df"}' '{name_z param_sd="zka" param_s="df"}' '{name_a param_y="wtf" param_z="kro" param_c="ptz" param_ch="www"}' '{name_a param_y="wtf"}' '{name_a param_sd="zka" param_y="wtf"}' '{name_a param_y="wtf"}'
Updates:
Update: Note that I'm using ' (single-quote) instead of " (double-quote) as the parameter value delimiter in my code and testing. This uses 5.10+ regex features. This has withstood everything I have thrown at it (including the multi-line example of the OP!),sub xform { my ($string, ) = @_; my $xy = qr{ [xy] }xmso; my $val = qr{ = ' [^']* ' }xmso; my $param_ = qr{ \s+ param_ }xmso; my $param_xy = qr{ $param_ $xy $val }xmso; my $param_any = qr{ $param_ \w+ $val }xmso; $string =~ s{ (?: \G (?<! ^) | ^ \{ name_a) $param_xy*+ \K $param_any } ''xmsg; return $string; }
In reply to Re: RegExp: pos management in global substitution
by AnomalousMonk
in thread RegExp: pos management in global substitution
by OlegG
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |