http://www.perlmonks.org?node_id=1055870


in reply to Named capture backreferences cannot be used in character classes?

One workaround is to use a negative look-ahead plus a dot instead of a negated character class:

use strict; use warnings; use 5.010; for (qw/'abc' "abc" 'abc"/) { if (/(?<FQ>['"])(?<content>(?:(?!\k<FQ>).)+)\k<FQ>/s) { say $+{content}; } else { say "Not matched: $_"; } } __END__ abc abc Not matched: 'abc"
  • Comment on Re: Named capture backreferences cannot be used in character classes?
  • Download Code

Replies are listed 'Best First'.
Re^2: Named capture backreferences cannot be used in character classes?
by BrowserUk (Patriarch) on Sep 26, 2013 at 17:45 UTC

    Perfect. Thank you.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re^2: Named capture backreferences cannot be used in character classes?
by Anonymous Monk on Sep 26, 2013 at 22:49 UTC

    Probably not worth it, but fewer negative look-aheads:

    my $re = qr/ (?<FQ>['"]) # Capture starting quote. (?<content> # Capture content. (?: (?>[^'"]*) # Match non-quotes, don't backtrack. (?(?!\k<FQ>).) # Match opposite quote. )* # Repeat. ) \k<FQ> # Match ending quote. /x;