使用平衡组的正则表达式

2023-12-14

我有一个基本的文本模板引擎,它使用如下语法:

foo bar
%IF MY_VAR
  some text
  %IF OTHER_VAR
    some other text
  %ENDIF
%ENDIF
bar foo

我对用于解析它的正则表达式有一个问题,它没有考虑嵌套的 IF/ENDIF 块。

我当前使用的正则表达式是:%IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF

我一直在阅读有关平衡捕获组(.NET 正则表达式库的一项功能)的内容,因为我知道这是在 .NET 中支持“递归”正则表达式的推荐方法。

我一直在研究平衡组,到目前为止已经得出以下结论:

(
 (
  (?'Open'%IF\s(?<Name>[\w_]+))
  (?<Contents>.*?)
 )+
 (
  (?'Close-Open'%ENDIF)(?<Remainder>.*?)
 )+
)*
(?(Open)(?!))

但这并不完全符合我的预期。例如,它捕获了很多空组。帮助?


要使用平衡 IF 语句捕获整个 IF/ENDIF 块,可以使用以下正则表达式:

%IF\s+(?<Name>\w+)
(?<Contents>
    (?> #Possessive group, so . will not match IF/ENDIF
        \s|
        (?<IF>%IF)|     #for IF, push
        (?<-IF>%ENDIF)| #for ENDIF, pop
        . # or, anything else, but don't allow
    )+
    (?(IF)(?!)) #fail on extra open IFs
)   #/Contents
%ENDIF

这里的重点是:你cannot捕获在单个Match每个命名组中都不止一个。你只会得到一个(?<Name>\w+)例如,最后捕获的值的组。在我的正则表达式中,我保留了Name and Contents简单的正则表达式组,并限制了内部的平衡Contents组 - 正则表达式仍然包含在IF and ENDIF.

当您的数据更加复杂时,它会变得有趣。例如:

%IF MY_VAR             
  some text
  %IF OTHER_VAR
    some other text
  %ENDIF
  %IF OTHER_VAR2
    some other text 2
  %ENDIF
%ENDIF                 
%IF OTHER_VAR3         
    some other text 3
%ENDIF                 

在这里,您将获得两场比赛,一场是MY_VAR,还有一个用于OTHER_VAR3。如果你想捕获两个 ifMY_VAR的内容,您必须在其上重新运行正则表达式Contents组(如果必须的话,您可以通过使用前瞻来绕过它 - 将整个正则表达式包装在(?=...),但您需要使用位置和长度以某种方式将其放入逻辑结构中)。

现在,我不会解释太多,因为看起来你已经了解了基础知识,但关于内容组的简短说明 - 我使用了所有格组来避免回溯。否则,该点最终可能会匹配整个IF并打破平衡。组中的惰性匹配的行为类似(( )+?代替(?> )+).

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

使用平衡组的正则表达式 的相关文章

  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 在 Android 上动态创建 Widget

    是否可以在运行时创建多个小部件 应用程序 活动 应在某些情况下生成具有新名称和标签的新小部件 或编辑现有部件 并在单击时执行一些原始操作 这些操作应在桌面小部件菜单中可用 是否可以创建多个 运行时小部件 No 应用程序 活动 应该生成 在某
  • [PDOException]:SQLSTATE [28000] [1045]用户'root'@'localhost'访问被拒绝(使用密码:NO)Symfony2

    我尝试使用 Symfony2 创建数据库 我使用了命令 php app console doctrine create database 结果是 PDO异常 SQLSTATE 28000 1045 用户 root localhost 的访问
  • Azure Graph API、Angular、获取用户组

    我想查询 Azure AD Graph API 以检索团体声称对于从注册的 Azure B2C 应用程序登录的用户 我调用的应用程序是 Angular 5 SPA 在尝试了 Azure Active Directory 和 adal ang
  • C 中返回值周围的括号

    在 ANSI C 代码中 我经常可以看到单个返回值周围有括号 像这样 int foo int x if x return 1 else return 0 在这些情况下为什么要在返回值周围使用 有任何想法吗 我看不出有什么理由 没有什么真正的
  • Cloud Firestore 中多租户的命名空间

    我们如何在 Firestore 中设置不同的数据库 命名空间 这将有助于构建多租户 SaaS 产品 这是正在考虑的事情 但还没有确定的计划 当前的方法需要您创建单独的项目 集合名称方案可能是可行的 但您将遇到项目的复合索引限制
  • 为什么Python对可以嵌套的静态块的数量有限制?

    Python 中静态嵌套块的数量限制为 20 个 即嵌套19for循环就可以了 虽然非常耗时 O n 19 太疯狂了 但嵌套 20 会失败 并显示 SyntaxError too many statically nested blocks
  • MVC 2 接口上的 UpdateModel,是否应该忽略 ModelBinderAttribute?

    我有从特定抽象类的实例发布数据的表单 public abstract class IRestriction public string Name get set public abstract IModelBinder GetBinder
  • 如何将模型或字符串传递给 angularjs 中的指令?

    我正在研究一个指令 其中参数之一可以是模型 动态值 有时也可以是字符串 我能做到这一点的唯一方法是使用 有一个更好的方法吗
  • 搜索 HTML 表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我已经用 HTML 创建了
  • 之前触发 onchange 时未触发 onclick 事件

    我这里有一个有趣的问题 我有一个文本区域 其中链接了一个 onchange 事件 然后我有一个链接到 onclick 事件的按钮 当在文本区域上触发 onchange 事件时 将处理放入文本区域的文本 当我单击文本区域之外的内容时 通常会发
  • 使用 pyodbc 和 mysql8 的参数化查询对于 int 数据类型的列返回 0

    蟒蛇 2 7 12 pyodbc 4 0 24 操作系统 Ubuntu 16 4 数据库 MySQL 8 驱动程序 MySQL 8 预期行为 结果集应在数据类型为 int 的列中包含数字 实际行为 所有 int 数据类型的列都有 0 如果使
  • 带有 ListBox 的 WPF ListBox - UI 虚拟化和滚动

    我的原型显示包含 页面 的 文档 由缩略图表示 每个文档可以有 任意数量的页面 例如 可能有 1000 个文档 每个文档 5 页 或 5 个文档 每个文档 1000 页 每个 或介于两者之间 文档不包含其他文档 在我的 xaml 标记中我有
  • 当我的整个应用程序锁定在纵向模式时,以横向模式全屏播放视频

    我想以全屏横向模式播放视频 我的应用程序锁定在纵向模式 如何实现这一点 请帮我 提前致谢 swift 3 中最简单的解决方案 将其添加到您的应用程序委托中 func application application UIApplication
  • 在 Firebase 中获取子项计数

    请问我如何简单地从 firebase 查询中获取子项计数 例如 假设我使用包含 10 个子项的数据库查询 我如何获取该值 因为我尝试使用onChildChanged 事件并从中获取价值snapshot 但效果并不好 这是因为首先它会获取数字
  • 无法连接到服务器 - 与网络相关或特定于实例的错误

    尝试连接到 SQL Server 时出现以下错误 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误 服务器未找到或无法访问 验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接 提供程序 命名管道提供
  • 将派生类指针数组转换为基类指针数组

    考虑这样的继承层次结构 A B1 B2 C D 在C 中实现如下 class A public A virtual A 0 double a A A class B1 virtual public A public B1 virtual B
  • 如何计算 numpy 数组沿轴的平均值? [复制]

    这个问题在这里已经有答案了 我是Python新手 这是我的三维数组 my data numpy zeros index1 index2 index3 为了便于说明 假设尺寸为 index1 5 index2 4 index3 100 我想计
  • 使用 SNI 选项以编程方式在 IIS 8 上添加绑定

    我正在尝试使用 Microsoft Web Administration 库 NET Framework 创建 IIS 8 的绑定 该绑定已检查标志 SNI 服务器名称指示 这对我来说是必要的 因为我想在 IIS 下为同一个网站获取多个 S
  • Swing、Java 和多线程以及着色按钮

    是的 这是家庭作业 是的 我完全被困住了 这是要点 我创建了一个 JFrame 有 3 个面板 顶部 中间 底部 底部面板中有 3 个按钮 红色 绿色和蓝色 顶部面板中有 3 个文本字段 用于显示单击相应按钮的次数 每个按钮最多允许 10
  • 使用平衡组的正则表达式

    我有一个基本的文本模板引擎 它使用如下语法 foo bar IF MY VAR some text IF OTHER VAR some other text ENDIF ENDIF bar foo 我对用于解析它的正则表达式有一个问题 它没