繁体   English   中英

告诉RegEx在引号内忽略括号

[英]Tell RegEx to ignore parenthesis when inside a quote

我有以下RegEx使用和工作:

/\\B@(@?\\w+(?:::\\w+)?)([ \\t]*)(\\( ( (?>[^()]+) | (?3) )* \\))?/x

这个字符串@extends('template', 'test')正确地分组并给我我需要的东西。

问题是如果字符串在引号内包含一个未闭合的括号 - 它将失败:

@extends('template', 'te)st')给出@extends('template', 'te)作为输出

如何告诉此RegEx忽略引号内的括号( '"

以下是问题的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  
)?

但我似乎无法弄清楚如何将该规则应用于这些特定的括号

您可以使用前瞻为此目的

这是我的正则表达式,将匹配所有extends的第二个参数

(?=(\\ W +)| \\ W +())[\\ w)的(] +

分解:

' :开始搜索带引号的字符串

?=XXX) :向前看,确保前方存在XXX

(\\w+\\)|\\w+\\() :搜索打开或关闭大括号

现在,如果前瞻性成功,我们可以确定我们有一个引号后面跟一个括号。 现在我们可以简单地编写正则表达式来制作括号

[\\w\\)\\(]+ :就是这么做的

现在我们可以在其中找到带括号的引号,我们可以使用if-else条件为每种情况使用适当的规则

(?(?=regex)then|else)

这是我实现它的方式:

(?(?='(?=(\w+\)|\w+\())) <- condition, same as above
'[\w\)\(]+' <- We have a match so we ignore parenthesis
|'\w+' <- Here we don't
)

PS。 我不太了解你为你的正则表达式中的其他部分所写的很多内容,也许是为了涵盖其他一些案例,所以我不是要编写修改你的原始正则表达式。 您只需使用上述参数检查第二个参数即可

这是我的正则表达式,它匹配你的所有情况。

\\B@\\w+\\('[\\w+\\s]+',\\s+(?(?='(?=(\\w+\\)|\\w+\\()))'[\\w\\)\\(]+'|('\\w+'|\\$\\w+))\\)

您可以在此处查看测试用例

PS。 为了表明它确实有效,我添加了一些失败的测试用例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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