我可以使用 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 正则表达式来匹配平衡文本吗? 的相关文章

  • 匹配括号内任何字符的正则表达式

    尝试创建一个与括号内的任何字符匹配的正则表达式 我的正则表达式模式是这样的 preg match listanswer answer 括号内的所有字符串都是匹配模式 但问题是 当我尝试匹配例如 this word sample data 它
  • [Regex]::Replace() 和 -replace 有什么区别?

    我明白了之间的区别 Replace and replace 但是什么是 replace and Regex Replace 我测试了以下两个代码 但对我来说结果完全相同 我还提到了 PowerShell Cookbook O reilly
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

    我所做的是从开头删除 92 或 0092 并使用以下代码检查它是否是巴基斯坦人的有效手机号码 if preg match 3 0 4 0 9 number 1 Pakistani mobile number else not a pakis
  • Perl Parallel::Forkmanager 不允许收集变量值

    也许因为子进程不知道我的散列 请参阅下面的代码 散列 输出没有收集任何内容 除了写入 tmp 文件之外 还有其他方法来收集该值吗 foreach Item AllItems pid pm gt start Item and next Tem
  • 什么是仅匹配空字符串的正则表达式?

    有很多关于正则表达式的帖子来匹配潜在地空字符串 但我找不到任何提供正则表达式的字符串only匹配一个空字符串 我知道 将匹配任何行的开头并且 将匹配任何行的结尾以及字符串的结尾 像这样 匹配的内容远不止空字符串 如 n foobar n n
  • 在 qx 运算符中将 perl 数组拆分为单独的参数

    我试图将一组参数传递给qx操作员 考虑 my files qw A txt B txt print qx ls files 这给出了错误 ls cannot access A txt B txt No such file or direct
  • 使用 -T 开关运行时 $ENV{ENV} 不安全

    当我尝试最后一个例子时perlfaq5 如何计算文件中的行数 http perldoc perl org perlfaq5 html How do I count the number of lines in a file 我收到一条错误消
  • PHP 中的 Preg_replace

    我想替换 中包含的字符串中的内容content 它是多行等 preg replace 函数应该删除整个 com 没有垫子 蒙特 尝试这个 result preg replace s replacement content subject
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 从正则表达式对象中提取允许字符串的最大长度

    一旦加载到 C 中 是否可以从正则表达式模式中提取允许的字符串的最大长度Regex object 如果我有一个正则表达式字符串定义为 A Z0 9 0 20 我可以使用字符串操作来获取最大允许长度20 但是 有没有一种方法可以更轻松地实现这
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • 删除字符串末尾的句点和数字

    如何删除尾随句点 后面紧跟一个数字 长度为一位或两位数字 例子 z lt c awe p 56 red 45 ted 5 you 88 tom 我只想删除 45和 5 你只需要一个简单的正则表达式 z new gsub 0 9 z 一些评论
  • 为什么我的 javascript regex.test() 给出交替结果[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 正则表达式返回 true 然后 false 然后 true 等等 https stackoverflow com questions 2630418 javascript reg
  • 正则表达式最多匹配五个单词

    我有一个正则表达式 a zA Z 0 9 1 5 它验证该单词包含字母数字字符和少数特殊字符 并且长度不应超过5人物 如何使此正则表达式接受最多五个与上述正则表达式匹配的单词 a zA Z 0 9 1 5 s a zA Z 0 9 1 5
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 匹配所有有效格式 IPv6 地址的正则表达式

    乍一看 我承认这个问题看起来像是这个问题以及与之相关的任何其他问题的重复 匹配有效 IPv6 地址的正则表达式 https stackoverflow com questions 53497 regular expression that
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • python中有没有一种方法可以将存储在列表中的正则表达式模式列表应用到单个字符串?

    我有一个正则表达式模式列表 存储在列表类型中 我想将其应用于字符串 有谁知道一个好方法 将列表中的每个正则表达式模式应用于字符串 和 如果匹配 则调用与列表中该模式关联的不同函数 如果可能的话我想用 python 来做这件事 提前致谢 im

随机推荐

  • 将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