in reply to Re: Problem with regex from Learning Perl (3rd edition)
in thread Problem with regex from Learning Perl (3rd edition)

The thing is that "hello"you" should not match because it has a " in the middle, which is what [^"] is taking care of. Forget, for now, about the surrounding double-quotes. I know I'm right, because if you use lets say /^"([^x]*)"$/ than "extra" won't match, but "estra" will. :-/

Replies are listed 'Best First'.
Re: Re: Re: Problem with regex from Learning Perl (3rd edition)
by grep (Monsignor) on Mar 08, 2002 at 05:52 UTC

    Hopefully I can break this down in a little better explaination.


    /"([^"]*)"/
  • 1. [^"] is a negated character class. Which means 'any character except (")'.
  • 2. [^"]* Your regex wants 'zero or more (*)' of that negated character class.
  • 3. /"([^"]*) then your regex wants 1 double quote at the beginning of a match (not the line)
  • 4. /"([^"]*)"/ then your regex wants 1 double quote at the end of the match
  • Ok now lets break down what happens with your string "hello"you"

  • " Your first character. Your regex is happy it matches number 3
  • hello" Your regex clicks along happily down the next 5 non-double quotes till it sees ". Oops this breaks rule number 1.
  • hello Your regex moves back one click. It is happy again it matches number 2
  • "hello" Your regex moves forward one click to match number 4.
  • You regex is happy and matches all 4 of your rules

    If you apply this to your other regex /^"([^x]*)"$/ you can see why your examples work

    HTH

    grep
    grep> cd /pub
    grep> more beer
      I knew that...:p
Re: Re: Re: Problem with regex from Learning Perl (3rd edition)
by dws (Chancellor) on Mar 08, 2002 at 06:05 UTC
    The thing is that "hello"you" should not match because it has a " in the middle, which is what [^"] is taking care of.

    I misread the question. If you're trying to reject strings with embedded quotes,

    "What happens," he asked, "with a string like this?"
    Do you reject this, or match "What happens," and "with a string like this?" ?

    You've bitten of a problem that gets harder the closer you look at it.

Re: Re: Re: Problem with regex from Learning Perl (3rd edition)
by seattlejohn (Deacon) on Mar 08, 2002 at 06:46 UTC
    grep gives a nice step-by-step explanation. It might also help if you take a moment to consider how this:
    /"([^"]*)"/
    differs from this:
    /^"([^"]*)"$/