我有以下已使用并起作用的正则表达式:
/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x
其中这个字符串 @extends('template', 'test') 正确地分组并给出了我需要的内容。
问题是,如果字符串中包含引号内未关闭的括号,则会失败:
@extends('template', 'te)st') 将输出 @extends('template', 'te)
如何告诉这个正则表达式忽略在引号内的括号(单引号或双引号)?
这里是一个演示该问题的 RegExr:http://regexr.com/v1?396ci 这里是一系列应该都能通过的字符串列表:
但是我似乎无法弄清如何将该规则应用于这些特定的括号。
/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x
其中这个字符串 @extends('template', 'test') 正确地分组并给出了我需要的内容。
问题是,如果字符串中包含引号内未关闭的括号,则会失败:
@extends('template', 'te)st') 将输出 @extends('template', 'te)
如何告诉这个正则表达式忽略在引号内的括号(单引号或双引号)?
这里是一个演示该问题的 RegExr:http://regexr.com/v1?396ci 这里是一系列应该都能通过的字符串列表:
@extends('template', 'test') // working
@extends('template', $test) // working
@extends('template', 'te()st') // working
@extends('template', 'te)st') // broken
@extends('template', 'te())st') // broken
@extends('template', 'te(st') // broken
@extends('template', 'test)') // broken
@extends('template', '(test') // broken
我已经缩小了范围 - 我认为我需要能够表达
(
\( <-- only if not inside quotes
(
(?>[^()]+) | (?3)
)*
\) <-- only if not inside quotes
)?
但是我似乎无法弄清如何将该规则应用于这些特定的括号。
)
? - Laurence