I am trying to write a regex in Ruby to test a string such as:
"GET \"anything/here.txt\""
the point is, everything can be in the outer double quote, but all double quotes in the outer double quotes must be escaped by back slash(otherwise it doesnt match). So for example
"GET "anything/here.txt""
this will not be a proper line.
I tried many ways to write the regex but doest work. can anyone help me with this? thank you
You can use positive lookbehind:
/\A"((?<=\\)"|[^"])*"\z/This does exactly what you asked for: “if a double quote appears inside the outer double quotes without a backslash prefixed, it doesn’t match.”
Some comments:
\A,\z: These match only at the beginning and end of the string. So the pattern has to match against the whole string, not a part of it.(?<=): This is the syntax for positive lookbehind; it asserts that a pattern must match directly before the current position. So(?<=\\)"matches “a double quote which is preceded by a backslash”.[^"]: This matches “any character which is not a backslash”.One point about this regex, is that it will match an inner double quote which is preceded by two backslashes. If that is a problem, post a comment and I’ll fix it.
If your version of Ruby doesn’t have lookbehind, you could do something like:
/\A"(\\.|[^"\\])*"\z/Note that unlike the first regexp, this one does not count a double backslash as escaping a quote (rather, the first backslash escapes the second one), so
"\\""will not match.