我可以使用 Perl 正则表达式来匹配平衡文本吗?

2024-01-12

我想在 Perl 中匹配括号等中包含的文本。我怎样才能做到这一点?


这是来自官方常见问题解答 http://faq.perl.org. We're 将 perlfaq 导入 Stack Overflow https://meta.stackexchange.com/questions/24244/can-we-import-the-perlfaq-into-stackoverflow.


这是官方常见问题解答 http://faq.perl.org/perlfaq6.html#Can_I_use_Perl_regul减去任何后续编辑。

您的第一次尝试可能应该是文本::平衡 http://search.cpan.org/perldoc/Text::Balanced模块,自 Perl 5.8 起就包含在 Perl 标准库中。它具有多种处理棘手文本的功能。这正则表达式::常见 http://search.cpan.org/perldoc/Regexp::Common模块还可以通过提供您可以使用的固定模式来提供帮助。

从 Perl 5.10 开始,您可以使用递归模式将平衡文本与正则表达式进行匹配。在 Perl 5.10 之前,您必须诉诸各种技巧,例如在(??{})序列。

这是使用递归正则表达式的示例。目标是捕获尖括号内的所有文本,包括嵌套尖括号内的文本。此示例文本有两个“主要”组:一个具有一层嵌套的组和一个具有两层嵌套的组。尖括号中共有五组:

I have some <brackets in <nested brackets> > and
<another group <nested once <nested twice> > >
and that's it.

匹配平衡文本的正则表达式使用两个新的(对于 Perl 5.10)正则表达式功能。这些内容涵盖在perlre http://perldoc.perl.org/perlre.html此示例是该文档中示例的修改版本。

首先,添加新的所有格+到任何量词都会找到最长的匹配并且不会回溯。这很重要,因为您想通过递归处理任何尖括号,而不是回溯。群组[^<>]++查找一个或多个非尖括号而不回溯。

二、新(?PARNO)指的是特定捕获组中的子模式PARNO。在下面的正则表达式中,第一个捕获组找到(并记住)平衡文本,并且您需要在第一个缓冲区中使用相同的模式来越过嵌套文本。这就是递归部分。这(?1)使用外部捕获组中的模式作为正则表达式的独立部分。

把它们放在一起,你有:

#!/usr/local/bin/perl5.10.0

my $string =<<"HERE";
I have some <brackets in <nested brackets> > and
<another group <nested once <nested twice> > >
and that's it.
HERE

my @groups = $string =~ m/
        (                   # start of capture group 1
        <                   # match an opening angle bracket
            (?:
                [^<>]++     # one or more non angle brackets, non backtracking
                  |
                (?1)        # found < or >, so recurse to capture group 1
            )*
        >                   # match a closing angle bracket
        )                   # end of capture group 1
        /xg;

$" = "\n\t";
print "Found:\n\t@groups\n";

输出显示 Perl 找到了两个主要组:

Found:
    <brackets in <nested brackets> >
    <another group <nested once <nested twice> > >

通过一些额外的工作,您可以将所有组放在尖括号中,即使它们也位于其他尖括号中。每次获得平衡匹配时,请删除其外部分隔符(这是您刚刚匹配的分隔符,因此不要再次匹配它)并将其添加到要处理的字符串队列中。继续这样做,直到没有匹配项为止:

#!/usr/local/bin/perl5.10.0

my @queue =<<"HERE";
I have some <brackets in <nested brackets> > and
<another group <nested once <nested twice> > >
and that's it.
HERE

my $regex = qr/
        (                   # start of bracket 1
        <                   # match an opening angle bracket
            (?:
                [^<>]++     # one or more non angle brackets, non backtracking
                  |
                (?1)        # recurse to bracket 1
            )*
        >                   # match a closing angle bracket
        )                   # end of bracket 1
        /x;

$" = "\n\t";

while( @queue )
    {
    my $string = shift @queue;

    my @groups = $string =~ m/$regex/g;
    print "Found:\n\t@groups\n\n" if @groups;

    unshift @queue, map { s/^<//; s/>$//; $_ } @groups;
    }

输出显示所有组。最外面的匹配项首先显示,嵌套的匹配项稍后显示:

Found:
    <brackets in <nested brackets> >
    <another group <nested once <nested twice> > >

Found:
    <nested brackets>

Found:
    <nested once <nested twice> >

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

我可以使用 Perl 正则表达式来匹配平衡文本吗? 的相关文章

  • 在 C# 中使用正则表达式重复模式

    我有一串话 词黑暗王辉光我们结束你好再见低翼 我需要找到第一个单词的最后一个字母与以下单词的第一个字母匹配的单词 例如 worD Dark 我写了一个正则表达式 b w w W 1 w b 目前它成功找到连续 2 个单词 Regex Mat
  • XRegExp 没有后视功能?

    我需要在JavaScript中使用正则表达式的lookbehind 所以发现在 JavaScript 中模拟lookbehind 第 2 步 https gist github com slevithan 2387872 另外 我发现作者
  • 禁用特定 java 包的所有 checkstyle 检查

    我有两个包 即 com mydomain abc delegate xyz jaxws 托管 and com mydomain abc xyz jaxws managed 我要求仅对第二个包禁用 checkstyle 因为它们包含自动生成的
  • 使用正则表达式正确替换缩写及其扩展

    我需要更换 HYD 和 HYD 带液压 但正如你所见 HYD 没有得到转换 我究竟做错了什么 console log HYD bHYD b gi test HYD OK console log HYD CYLINDER bHYD b gi
  • Java:正则表达式,其中每个字符出现0-1次

    Problem 匹配正则表达式的每个字符最多出现一次的单词 该单词必须具有一定的大小 例如 2 5 单词中必须有一个特定的字符 比方说字符 e 我有什么 word matches abcde 2 5 这将匹配字符 a b c d 和 e 出
  • 从字符串中提取数字 (Regex C++)

    假设我有一根绳子S 1 this is a number 200 Val 54 4class find57 我想用Regex仅提取这些数字 num 1 1 num 2 200 num 3 54 而不是 4class 中的 4 或 find5
  • 使用 javascript 将多行、缩进的 json 转换为单行

    我想出了以下函数 用于将多行 缩进的 json 转换为单行 function text var outerRX s n r g innerRX s n r return text replace outerRX function 0 1 r
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • 仅在大括号外的空格上分割字符串

    我是正则表达式新手 我需要一些帮助 我阅读了一些与此问题类似的主题 但我不知道如何解决它 我需要在不在一对大括号内的每个空格上分割一个字符串 大括号外的连续空格应被视为单个空格 TEST test test test test test t
  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用
  • 使用解析将 ** 运算符更改为幂函数?

    我的要求是将 运算符更改为幂函数 例如 1 Input B 2 Output power B 2 2 B 2 T 2 X Output power B 2 我写了下面的正则表达式来解决这个问题 rx r a zA Z0 9 a zA Z0
  • Javascript 正则表达式来匹配正则表达式

    我正在研究一个特殊的正则表达式来匹配 javascript 正则表达式 现在我有这个正则表达式工作 i g m 例如 foo match i g m gt foo foo undefined foo i match i g m gt foo
  • 文件名的正则表达式模式

    如果文件名符合以下条件 用户可以将文件放入服务器 它必须以 abc 开头 然后是一个点和一个数字 Valid file names abc 2344 abc 111 Invalid abcd 11 abc ab12 正则表达式是什么 我不能
  • 我可以缩短这个正则表达式吗?

    我需要检查字符串是否符合特定的 ID 格式 ID的格式如下 aBcDe fghIj KLmno pQRsT uVWxy 由五个大写或小写字母组成的五个块的序列 由一个破折号分隔 我有以下有效的正则表达式 string idFormat a
  • Java中字符串中特殊字符的替换

    Java中如何替换字符串 E g String a adf sdf 如何替换和避免特殊字符 您可以删除除此之外的所有字符可打印的 ASCII 范围 http en wikipedia org wiki ASCII ASCII printab
  • 使用 sed 删除大括号对之间的所有内容

    我有一个看起来像这样的字符串 B F blue master F red f k b f k b K black B F green 我想删除匹配的子字符串 它可能包含也可能不包含相同顺序的其他子字符串 我应该得到 master 作为最终输
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • .htaccess 如果 URL 错误,请执行某些操作

    我正在做我的个人CMS http en wikipedia org wiki Content management system 我想在其中使用很酷 友好 的 URL 这是我的 htaccess 文件代码 RewriteEngine on
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional

随机推荐

  • 将clear:both替换为伪类

    以前 当我有浮动块时 我将停止浮动 我使用 div div 但现在 我用伪类解决这个问题 last floating div after content display table clear both 我一直工作得很完美 但今天 不行了
  • 为什么我无法在 Python 中加入这个元组?

    e ham 5 1 bird logfile write join e 我必须加入它才能将其写入文本文件 join只接受字符串列表 所以先转换它们 gt gt gt e ham 5 1 bird gt gt gt join map str
  • 自定义链式比较

    Python 允许这样的表达式x gt y gt z 根据文档 这相当于 x gt y and y gt z except y仅评估一次 https docs python org 3 reference expressions html
  • Rails 3:获取当前名称空间?

    使用方法 layout for namespace 我根据我是在前端还是后端设置应用程序的布局 因为后端使用命名空间 admin 我找不到一种很好的方法来找出我所在的命名空间 我找到的唯一方法是解析 params controller 中的
  • VS Express 2013 for Web - 浏览器受到安全限制或 JavaScript 被禁用

    我最初在桌面上安装了 Microsoft Visual Studio Express 2013 for Web 我的桌面运行 Windows 8 1 和 Internet Explorer 11 它运行良好 直到许可证在前 30 天后过期
  • 如何指定 NSDictionary 的keysOfEntriesPassingTest 所需的块对象/谓词?

    出于学习 尚不实用 的目的 我想在 NSDictionary 上使用以下方法来返回一组键 这些键具有使用我定义的测试的值 不幸的是不知道如何指定谓词 NSDictionary keysOfEntriesPassingTest NSSet k
  • Emacs 诊断:Org 模式速度慢得难以忍受并且经常停止

    我的 Emacs Windows 10 64 位下的 GNU Emacs 25 1 1 x86 64 w64 mingw32 变得异常缓慢且不稳定 尤其是在 Org 模式下 例如可能会暂停 2 秒以上来移动光标 并暂停 3 秒以上来刷新以显
  • 查询的最小异或

    我在一次采访中被问到以下问题 给定一个数组A with N元素和数组B with M元素 对于每个 B X 返回 A I 其中 A I 和 B X 的 XOR 最小 例如 Input A 3 2 9 6 1 B 4 8 5 9 Output
  • 主从应用程序的每个部分可以有不同的行数吗?

    我是 Swift 和 iOS 编程新手 正在尝试制作一些简单的应用程序 我正在尝试构建一个主从应用程序 在主视图中 我给了表格视图两个部分 并将表格视图的内容设置为 静态单元格 最初 我给每个部分 3 行 并且能够在 mainviewcon
  • 当前 Subversion 修订命令

    是否有 Subversion 命令可以显示当前版本号 After svn checkout我想启动一个脚本并需要变量中的修订号 如果有这样的命令就太好了svn info get revision number 较新版本的 svn 支持 sh
  • React-Router:在导航到不同的路由之前将逻辑应用于组件

    在导航到不同的路线之前是否可以将逻辑应用于组件 例如 我的组件看起来像这样 class Example extends React Component Handles logic for when user leaves page hand
  • 将纬度/经度转换为 JTS?

    我正在尝试将 hibernate 空间与 JPA 集成以进行地理搜索 我一直在参考tutorial http www hibernatespatial org tutorial html在官方网站上 我与 hibernatespatial
  • Excel VBA 按标题名称而不是列进行搜索

    我需要一个执行以下操作的 VBA 宏 这部分工作正常 我希望它在sheet1上创建一个新列并将其命名为标题名称然后为其着色 Columns P P Select Selection Insert Shift xlToRight CopyOr
  • 上半部和下半部概念澄清

    根据上半部和下半部的指导方针 当任何中断发生时 都会由两个半部处理 所谓的上半部分是实际响应中断的例程 您用 request irq 注册的例程 下半部分是由上半部分安排的例程 稍后在更安全的时间执行 上半部处理程序和下半部处理程序之间的最
  • Pytest 使用线程无限期运行

    我正在使用 PyTest 为个人项目执行一些单元测试 pytest 调用一个初始化多个线程的类 由于这些线程无限期地运行 它们永远不会关闭 并且 pytest 永远不会终止 这意味着我运行测试的 gitlab 管道自动失败 线程对于测试和模
  • 使用WCF进行大数据传输

    我在一个项目中 必须使用 wcf 服务在源和客户端之间来回传输大量数据 将数据作为数据集 XML 对象数组传输的最佳选项是什么 或者还有其他选项吗 您可以使用 WCF 流 以下是了解更多信息的链接 大数据和流媒体 http msdn mic
  • 单个实体中的实体框架 1 到 0..1 关系

    Scenario 我有一个场景 在单个实体中为数据库中的两个表定义了 1 对 1 关系 我通过使用以下映射来做到这一点 为了保护无辜者 名称已更改 modelBuilder Entity
  • Symfony2 DoctrineExtensions preSoftDelete 事件调用

    我在为 Symfony2 实现 L3pp4ard DoctrineExtensions Bundle 中的 preSoftDelete 事件时遇到问题 softDelete 函数工作得很好 但我想在deletedAt 日期时间 旁边添加一个
  • 如何使用已排序的键列表对 OrderedDict 进行排序?

    假设我有一个collections OrderedDict对象及其重新排列的键列表 ordereddict collections OrderedDict key 78 value key 40 value key 96 value key
  • 我可以使用 Perl 正则表达式来匹配平衡文本吗?

    我想在 Perl 中匹配括号等中包含的文本 我怎样才能做到这一点 这是来自官方常见问题解答 http faq perl org We re 将 perlfaq 导入 Stack Overflow https meta stackexchan