16

I have the following string:

_name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"

I want to match everything between = and the end " (note there are other quotes after this so I can't just select the last ").

I tried using _name=(.*?)" but there are other quotes in the string as well. Is there a way to match the 3rd quote? I tried _name=(.*?)"{3} but the {3} matches for the quotes back to back, i.e. """

You can try it here

Cœur
  • 37,241
  • 25
  • 195
  • 267
Bijan
  • 7,737
  • 18
  • 89
  • 149

2 Answers2

19

You can use this regex:

\b_name=(?:[^"]*"){3}

RegEx Demo

RegEx Details:

  • \b_name: Match full word _name:
  • =: Match a =
  • (?:[^"]*"){3}: Match 0 or more non-" characters followed by a ". Repeat this group 3 times.
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • This solution even matches **_name=** along with the required match which we don't want! so shouldn't we just add a bracket around like this: `_name=((?:[^"]*"){3})` https://regex101.com/r/oK0eO2/374 Please tell me if I got this wrong? – Aashit Garodia Jun 21 '21 at 21:31
  • If you want to capture part after `=` then `_name=((?:[^"]*"){3})` seems correct. – anubhava Jun 23 '21 at 06:08
1

If want to match everything between the first and the third(!) double quote (the third isn't necessarily the last, you told), you can use a pattern like this:

$string = '_name=foo"bar"test" more text"';
// This pattern will not include the last " (note the 2, not 3)
$pattern = '/_name=((.*?"){2}.*?)"/';

preg_match($pattern, $string, $m);
echo $m[1];

Output:

foo"bar"test

Original answer:

I'm not sure if I got you correctly, but it sounds like you want to perform a so called greedy match, meaning you want to match the string until the last " regardless whether the string contains multiple "s.

To perform a greedy match, just drop the ?, like this:

_name=(.*)"

You can try it here: https://regex101.com/r/uC5eO9/2

hek2mgl
  • 152,036
  • 28
  • 249
  • 266
  • This is part of a curl request. There are other quotes after this but I am just looking to match the 3rd quote. Your code will match the _last_ one which is not what I want – Bijan Feb 10 '15 at 18:21