草庐IT

php - 告诉 RegEx 在引号内忽略括号

coder 2024-04-06 原文

我有以下使用和工作的正则表达式:

/\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)(]+

分割:

' : Start the search for string with quote

?=XXX) : Positive look ahead which ensures XXX is present ahead

(\w+\)|\w+\() : Search for either opening or closing braces

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

[\w\)\(]+ : Doing just that

现在我们可以找到其中带有括号的引号,我们可以使用 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
)

附言。我不明白你在正则表达式中为其他部分写的很多东西,也许是为了涵盖其他一些情况,所以我不会写来修改你原来的正则表达式。您可以简单地将第二个参数的检查切换为上述参数

这是我的正则表达式,可以匹配您的所有情况。

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

可以看到测试用例here

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

关于php - 告诉 RegEx 在引号内忽略括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43970168/

有关php - 告诉 RegEx 在引号内忽略括号的更多相关文章

  1. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  4. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  7. ruby -\'(反斜杠,单引号)在 Ruby 字符串中 - 2

    我正在使用Ruby1.8.7,试图生成一个带有\'字符的字符串,以便创建一个在MySQL中运行的脚本。结果应该是这样的:INSERTINTOtable(name,description)values('Joanad\'Arc','')但我不能在ruby​​字符串中只得到一个反斜杠。使用以下代码:string="INSERTINTOtable(name,description)values('Joanad\\'Arc','')"我得到了以下字符串:INSERTINTOtable(name,description)values('Joanad\\'Arc','')还有:string="IN

  8. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  9. ruby - 有什么方法可以告诉 sidekiq 一项工作依赖于另一项工作 - 2

    有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz

  10. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

随机推荐