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 |
| [reply] [d/l] [select] |
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.
| [reply] [d/l] |
grep gives a nice step-by-step explanation. It might also help if you take a moment to consider how this: /"([^"]*)"/ differs from this: /^"([^"]*)"$/ | [reply] [d/l] [select] |