如何编写匹配嵌套括号的递归正则表达式?

2023-12-30

我正在尝试编写一个与嵌套括号匹配的正则表达式,例如:

"(((text(text))))(text()()text)(casual(characters(#$%^^&&#^%#@!&**&#^*!@#^**_)))"

像这样的字符串应该被匹配,因为所有嵌套的括号都被关闭,而不是:

"(((text)))(text)(casualChars*#(!&#*(!))"

不应该,或者更好,应该至少匹配第一个“(((text)))(text)”部分。

实际上,我的正则表达式是:

 $regex = '/( (  (\() ([^[]*?)  (?R)?  (\))  ){0,}) /x';

但它并没有像我预期的那样正常工作。如何解决这个问题?我哪里错了?谢谢!


该模式的工作原理:

$pattern = '~ \( (?: [^()]+ | (?R) )*+ \) ~x';

括号内的内容简单描述一下:

“所有不是括号或递归(=其他括号)” x 0 次或多次

如果要捕获括号内的所有子字符串,则必须将此模式放入前瞻中以获得所有重叠结果:

$pattern = '~(?= ( \( (?: [^()]+ | (?1) )*+ \) ) )~x';
preg_match_all($pattern, $subject, $matches);
print_r($matches[1]);

请注意,我添加了一个捕获组并替换了(?R) by (?1):

(?R) -> refers to the whole pattern (You can write (?0) too)
(?1) -> refers to the first capturing group

这个前瞻技巧是什么?

前向(或后向)内的子模式不匹配任何内容,它只是一个断言(测试)。因此,它允许多次检查相同的子字符串。

如果显示整个模式结果(print_r($matches[0]);),您将看到所有结果都是空字符串。获取由前瞻内的子模式找到的子字符串的唯一方法是将子模式包含在捕获组中。

注意:递归子模式可以这样改进:

\( [^()]*+ (?: (?R) [^()]* )*+ \)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写匹配嵌套括号的递归正则表达式? 的相关文章

  • 如何使用 facebook 用户登录我的网站?

    我想知道 facebook 如何让用户登录我们的网站 我的意思是用户需要注册到我的网站才能发表评论 我如何通过我的 php 代码检查它是否是登录用户 我听说你只能用javascript检查它是否是登录用户 感谢您的任何解释 您可以使用脸书
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • localhost/test.php 不返回任何内容

    我正在遵循教程构建一个网络应用程序 我创建了一个简单的test php网络空间中的文件 var www html 问题是当我输入localhost test php在浏览器地址窗口中 它返回一个空页面 我试过localhost php in
  • 在 WooCommerce 中检查购物车中的多个产品 ID

    我使用以下代码来检查产品 ID 是否在购物车中 如果是 则添加额外的结帐字段 add action woocommerce after order notes conditional checkout field function cond
  • 只有一组多次捕获

    String 50 60 70 50 1 7 9 51 5 9 10 Want 9 51 Tried G K d Result 1 7 9 51 看来您正在使用 PCRE 正则表达式来获取可以在内部数学运算符前面添加的数字 没有内在的 Us
  • 句子中模糊的电子邮件地址

    我正在输出日志消息 需要隐藏其中的电子邮件地址 日志消息可能如下所示 A lead was saved for email protected cdn cgi l email protection Date 11th December 20
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 如何简单地检查服务器PHP版本是否为5或以上?

    我正在为程序创建预安装清单 该程序需要 PHP5 因此我需要检查列表脚本来检查 PHP5 的可用性 有一个函数为phpversion 将以以下格式返回5 3 6或类似的 然而 我希望清单非常简单 只是告诉你是或否 所以显示当前版本对我没有多
  • 负向查找正则表达式 - 仅出现一次 - Java

    我正在尝试查找字符串是否包含only one一个词的出现 e g String jjdhfoobarfoo Regex foo gt false String wewwfobarfoo Regex foo gt true String jj
  • PHP session_destroy() 警告会话对象销毁失败[重复]

    这个问题在这里已经有答案了 我有这个 php 脚本 但在破坏会话时遇到问题 我收到这个警告 警告 session destroy 会话对象销毁失败 第 6 行 C xampp htdocs template nota finalizare
  • 将 Php 数组编码为 json [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想对我的 php 数组进行编码 A
  • PHP:如何将信息返回到等待的脚本并继续处理

    假设有两个脚本Requester php和Provider php Requester需要Provider进行处理并向其发出http请求 Provider php data data 在这种情况下 Provider 很快就找到了答案 但为了
  • PHP 使用今天的日期生成一个随机数

    我正在尝试为内容块 在网页上 分配一个随机生成的数字 该数字基于今天的日期 无论是什么 和固定数字 由于某种原因 输出的数字种类存在巨大差异 例如 当我在本地测试我的代码时 生成的数字对我来说足够好 正数 但在实际的实时服务器上时 它们通常
  • 使用 PHP 将文件上传到 MySql DB

    我希望用户通过我在后端使用 MySql 用 PHP 开发的 web 应用程序上传文件 我想将文件存储在数据库中 我在这样做时遇到了问题 此外 一旦文件存储在数据库中 我们如何下载它 并在 web 应用程序中正确显示它 文件类型和文件的其他属
  • 由表达式文字生成的正则表达式是否共享单个实例?

    以下代码片段 来自 Crockford 的Javascript 好的部分 演示了由正则表达式文字创建的 RegExp 对象共享单个实例 function make a matcher return a gi var x make a mat
  • https 重定向 laravel .htaccess 之后删除 /public

    我有一个 Laravel 页面部署在共享主机中 当我强制 http 请求重定向到 https 时 url 包含 public 我的根 htaccess 是 RewriteEngine on RewriteCond REQUEST URI p
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • MySQL LAST_INSERT_ID() 和 FOUND_ROWS()

    当 PHP 脚本每秒有数百个查询时会发生什么 它会影响这些函数吗 是否保证它们会返回当前脚本中最后一个插入语句中最后插入的 id 它会返回当前脚本中最后一次选择的行数吗 如果同时从另一个脚本进行新的插入或选择 在 FOUND ROWS 的情
  • Laravel 5:在控制台内核的 Schedule() 函数中使用 Cache:: 或 DB::

    我正在尝试以不同的用户配置的时间间隔在 Laravel 5 中运行 Artisan 控制台命令 我已经构建了控制台命令 并拥有一个包含 运行频率 配置值的数据库 具有 Eloquent 模型 内schedule 的函数App Console
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org

随机推荐

  • 执行静态对象的析构函数时崩溃

    有一个微妙的错误在我们的软件中不会以可预测的方式显现出来 当全局析构函数执行时会发生这种情况 通常这是一个 双重释放 错误 但我也看到过其他事情 NULL ptr 取消引用 对未分配任何内容的地址的 ptr 取消引用 访问未对齐 因为指针有
  • 我可以创建一个引用内存中 NSData 的 NSURL 吗?

    的文档NSURL https developer apple com library ios documentation Cocoa Reference Foundation Classes NSURL Class Reference Re
  • Android:如何知道Fragment是否已完成加载整个内容?

    无论如何都知道Fragment已完成加载全部内容Fragment 我问的原因是因为onResume当我将应用程序置于后台时的状态我重新加载Fragment通过执行AsyncTask但我只想重新加载Fragment仅当Fragment尚未完成
  • 使用 Windows 批处理从文件中删除尾随空格?

    如何使用 Windows 命令提示符删除文本文件中的所有尾随空格 Ben Hocking 引用的 DosTips RTRIM 函数可用于创建一个可以正确修剪文本文件中每一行的脚本 然而 该功能相对较慢 DosTips 用户 和版主 aGer
  • 如何使用 sed/awk 查找/替换和增加匹配的数字?

    开门见山 我想知道如何使用 grep find sed awk 来匹配某个字符串 以数字结尾 并将该数字加 1 我最接近的是将 1 连接到最后 效果很好 因为要点是简单地改变值 这是我目前正在做的事情 find type f xargs s
  • 如何比较音乐数据

    我想编写一个应用程序来重命名 排序和组织我的音乐库 mp3 wav flac 我想提取歌曲的一部分 例如前几分钟 并将其与数据库进行比较 然后检索歌曲名称和标签信息 我听说你可以使用 last fm 来做到这一点 但是查看他们的 api 信
  • .NET Core 3.1 中的默认代理

    我需要一些有关 NET Core 3 1 的帮助 以获取需要脱离公司代理的代码 通过将以下内容放入 app config 中 该代码可在 NET 4 7 2 中运行 我在这个网站上了解到这一点 谢谢 允许人们通过公司代理服务器
  • PHPUnit:期望以数组作为参数的方法调用

    我有一个 PHPUnit 测试用例 其中我对以下代码片段感到困惑 我想检查一下该方法actionUpload正确调用函数 hideAndSaveDataLines 即第一个参数是一个数组 正如我所期望的那样 public function
  • 表达式中未定义函数“Nz”

    我用谷歌搜索了这个错误 但还没有得出为什么会收到这个错误的结论 我正在尝试用一些数据填充 DataGridView 这是我的代码 Private Sub LoadGrid Dim cmd As New OleDbCommand Dim dt
  • 计算月球表面旋转作为地球坐标的函数

    我正在编写一个 Android 应用程序 可以显示任何日期的月相 目前 我正在展示北半球的一般视图 月球受阳光照射的部分从right to left0 观察旋转 然而 当从南半球观察月球时 这种运动是相反的 而在赤道附近 则完全发生了不同的
  • 获取 VMS 的驱动程序以连接到 SQL Server 2005

    我想从 COBOL VMS 系统连接到 SQL Server 2005 实例 有人能给我指出一个运行良好的驱动程序吗 这类似于另一个问题 https stackoverflow com questions 898055 cobol to s
  • 通过 RubyGems 安装 JSON 1.8.1 时出错

    我的操作系统是 Windows 7 64x Ultimate 我尝试像这样安装 json gem gem install json v 1 8 1 但我有一个问题 Temporarily enhancing PATH to include
  • Dart/Flutter 的代码覆盖率可视化(特别适用于 Windows 和 VS Code)

    这原本是一个Dart Code 存储库中的 Github 问题 https github com Dart Code Dart Code issues 2860 1 背景 我一直在开发一个包含数百个测试的包 因此一种可视化代码覆盖率的简单方
  • 在 docker 环境中 pip install git+url

    我正在使用这个 Docker 来自lambda lambda python3 6 并且我需要安装一个私有存储库包 问题是 Docker 没有 git 我无法使用 apt get 或 apk install 安装 git 因为 Docker
  • Android - 以编程方式制作的 EditText 不显示键盘

    我正在制作一个应用程序 我正在使用ArrayAdapter
  • 如何获取 wkhtmltopdf 正文中的总页数?

    是否可以访问主要内容主体中的 topage 变量 我知道您可以在页眉和页脚中执行此操作 但在这个特定用例中 我需要在正文中添加一句话 本文档包含 XX 页 这对我有用 但需要位于页眉 ou 页脚 在体内我认为这是不可能的 就像他们在 Git
  • d3 用逗号替换分号

    希望比我聪明的人能够快速帮助解决这个问题 我有带有分号分隔符的 csv 文件 它无法读取标题 d3 csv file csv function error data data forEach function d d date parseD
  • 将 Jar 添加到独立的 pyspark

    我正在启动一个 pyspark 程序 export SPARK HOME export PYTHONPATH SPARK HOME python SPARK HOME python lib py4j 0 9 src zip python 和
  • C++ 中的动态数组 VS 链表[重复]

    这个问题在这里已经有答案了 当我们有动态数组列表时 为什么还需要链表 我研究过静态列表和链表 我了解动态数组列表 但我无法找出两者之间的确切区别 有人请帮我回答这个问题 动态数组是一种根据内容数量向上或向下调整自身大小的数组 优势 通过索引
  • 如何编写匹配嵌套括号的递归正则表达式?

    我正在尝试编写一个与嵌套括号匹配的正则表达式 例如 text text text text casual characters 像这样的字符串应该被匹配 因为所有嵌套的括号都被关闭 而不是 text text casualChars 不应该