简体   繁体   中英

Trying to merge two separate regular expressions into one

I need to extract a string that is enclosed by both parentheses and single quotes. Currently, I am using two regex pattern to do the job. With the first regex I retrieve a string from parentheses while the string still contains single quotes, and with the second regex I can strip that single quotes from it. Now, I would like to do this job in a single step. For the past one hour and so I have been experimenting with some patterns without any viable results; may be its due to my limited regex knowledge. So, any feedback you offer to me will be very helpful. I also welcome any solutions apart from regular expressions.

Here is an example string that needs to be parsed.

$string = "[('minute stroller workout', 9.0), ('week', 1.0), ('leaving', 1.0), ('times', 1.0), ('guilt', 1.0), ('baby', 1.0), ('beginning', 1.0)]";

# Strip parentheses
preg_match_all('#\((.*?)\)#', $string, $match);
# I am using the first match here
echo $match[1][0]; // output = 'minute stroller workout', 9.0

# Strip single quotes and extract the string
preg_match('~(["\'])([^"\']+)\1~', $match[1][0], $matches);
echo $matches[2]; // output = minute stroller workout (i.e. what we are looking for)  

If I understand you correctly

preg_match_all('/\(\'([\s\w]*)\', ([\d.]*)\)/', $string, $match);

Output for your string

array(3) {
  [0]=>
  array(7) {
    [0]=>
    string(32) "('minute stroller workout', 9.0)"
    [1]=>
    string(13) "('week', 1.0)"
    [2]=>
    string(16) "('leaving', 1.0)"
    [3]=>
    string(14) "('times', 1.0)"
    [4]=>
    string(14) "('guilt', 1.0)"
    [5]=>
    string(13) "('baby', 1.0)"
    [6]=>
    string(18) "('beginning', 1.0)"
  }
  [1]=>
  array(7) {
    [0]=>
    string(23) "minute stroller workout"
    [1]=>
    string(4) "week"
    [2]=>
    string(7) "leaving"
    [3]=>
    string(5) "times"
    [4]=>
    string(5) "guilt"
    [5]=>
    string(4) "baby"
    [6]=>
    string(9) "beginning"
  }
  [2]=>
  array(7) {
    [0]=>
    string(3) "9.0"
    [1]=>
    string(3) "1.0"
    [2]=>
    string(3) "1.0"
    [3]=>
    string(3) "1.0"
    [4]=>
    string(3) "1.0"
    [5]=>
    string(3) "1.0"
    [6]=>
    string(3) "1.0"
  }
}

You can use this single regex:

preg_match("#\('([^']+)#", $string, $matches);
echo $matches[1];
//=> minute stroller workout

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM