与原子分组的混淆 - 它与 Ruby 正则表达式中的分组有何不同?

2024-02-19

我已经浏览了文档原子分组 http://ruby-doc.org/core-1.9.3/Regexp.html#method-i-named_captures and rubyinfo http://www.regular-expressions.info/atomic.html我想到了一些问题:

  1. 为什么叫这个名字“原子分组”? What “原子性”有那个吗一般分组没有吗?
  2. 如何原子分组不同于一般分组?
  3. Why are 原子团 called 非捕获 groups?

我尝试了下面的代码来理解,但对输出以及它们在同一字符串上的工作方式有何不同感到困惑?

irb(main):001:0> /a(?>bc|b)c/ =~ "abbcdabcc"
=> 5
irb(main):004:0> $~
=> #<MatchData "abcc">
irb(main):005:0> /a(bc|b)c/ =~ "abcdabcc"
=> 0
irb(main):006:0> $~
=> #<MatchData "abc" 1:"b">

A ()具有一些属性(包括诸如(?!pattern), (?=pattern)等以及平原(pattern)),但它们之间的共同属性是grouping,这使得任意模式成为一个单元(单元是我自己的术语),这在重复中很有用。

正常捕获(pattern)具有以下属性捕获 and group。捕获意味着与内部模式匹配的文本将被捕获,以便您可以在匹配或替换时将其与反向引用一起使用。非捕获组(?:pattern)没有 capture 属性,因此与(pattern)因为它不存储与内部模式匹配的字符串的开始和结束索引。

原子分组(?>pattern)还具有非捕获属性,因此内部匹配的文本位置不会被捕获。

原子分组增加了以下属性atomic与捕获组或非捕获组相比。这里原子的意思是:在当前位置,找到first序列(首先是由引擎如何根据给定的模式匹配来定义的)与原子分组内的模式匹配并保留它(因此不允许回溯)。

没有原子性的组将允许回溯 - 它仍然会找到第一个序列,然后如果前面的匹配失败,它将回溯并找到下一个序列,直到找到整个正则表达式的匹配或用尽所有可能性。

Example

输入字符串:bbabbbabbbbc
图案:/(?>.*)c/

第一场比赛由.* is bbabbbabbbbc由于贪婪量词*。它将保留这场比赛,不允许c来自匹配。匹配器将在字符串末尾的下一个位置重试,并且会发生相同的情况。所以根本没有任何东西与正则表达式匹配。


输入字符串:bbabbbabbbbc
图案:/((?>.*)|b*)[ac]/, 供测试用/(((?>.*))|(b*))[ac]/

该正则表达式有 3 个匹配项,分别是bba, bbba, bbbbc。如果您使用第二个正则表达式,它是相同的,但添加了用于调试目的的捕获组,您可以看到所有匹配都是匹配的结果b* inside.

您可以在此处查看回溯行为。

  • 没有原子分组/(.*|b*)[ac]/,由于最后回溯匹配,该字符串将有一个匹配,即整个字符串[ac]。请注意,引擎将返回到.*回溯 1 个字符,因为它还有其他可能性。

    Pattern: /(.*|b*)[ac]/
    bbabbbabbbbc
    ^             -- Start matching. Look at first item in alternation: .*
    bbabbbabbbbc
                ^ -- First match of .*, due to greedy quantifier
    bbabbbabbbbc
                X -- [ac] cannot match
                  -- Backtrack to ()      
    bbabbbabbbbc
               ^  -- Continue explore other possibility with .*
                  -- Step back 1 character
    bbabbbabbbbc
                ^ -- [ac] matches, end of regex, a match is found
    
  • 通过原子分组,所有可能性.*被切断并仅限于第一场比赛。因此,在贪婪地吃掉整个字符串并且无法匹配之后,引擎必须去寻找b*模式,成功找到与正则表达式的匹配项。

    Pattern: /((?>.*)|b*)[ac]/
    bbabbbabbbbc
    ^             -- Start matching. Look at first item in alternation: (?>.*)
    bbabbbabbbbc
                ^ -- First match of .*, due to greedy quantifier
                  -- The atomic grouping will disallow .* to be backtracked and rematched
    bbabbbabbbbc
                X -- [ac] cannot match
                  -- Backtrack to ()
                  -- (?>.*) is atomic, check the next possibility by alternation: b*
    bbabbbabbbbc
    ^             -- Starting to rematch with b*
    bbabbbabbbbc
      ^           -- First match with b*, due to greedy quantifier
    bbabbbabbbbc
       ^          -- [ac] matches, end of regex, a match is found
    

    接下来的比赛将从这里继续进行。

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

与原子分组的混淆 - 它与 Ruby 正则表达式中的分组有何不同? 的相关文章

  • ruby从1.8.7升级到1.9.2(使用Rails 3.1.1)后本地服务器错误

    我刚刚安装了rvm并使用rvm将ruby从1 8 7升级到1 9 2 我在我的应用程序上运行了捆绑安装 它重新安装了我的 gems 当我在本地运行 Rails 服务器并将浏览器导航到 localhost 3000 时 服务器日志中显示以下错
  • PHP 中的 Preg_replace

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

    我正在编写一些代码并使用 rspec 但收到警告 提示语法已过时 我不太清楚应该如何编写它 it should calculate the value correctly do mock cards Card new clubs 5 Car
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • 正则表达式查找字符串中的整数和小数

    我有一个像这样的字符串 str1 12 ounces str2 1 5 ounces chopped 我想从字符串中获取金额 无论它是否是小数 12 或 1 5 然后获取紧邻的前一个测量值 盎司 我能够使用一个非常基本的正则表达式来获取测量
  • Word通配符搜索的正则表达式查找包含至少3个连续数字的括号

    在以下示例中 airspeed AS user 104A 104B device 101 vehicles 105A C 搜索应该找到 104A 104B 101 and 105A C 但不是 AS 我尝试使用 0 9 0 9 0 9 但这
  • 使用哈希参数进行 DRY Ruby 初始化

    我发现自己经常在构造函数中使用哈希参数 尤其是在为配置或最终用户将接触到的其他 API 编写 DSL 时 我最终做的是类似以下的事情 class Example PROPERTIES name age PROPERTIES each p a
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • netsh 结果到 PowerShell 对象

    我正在尝试与NETSH https ss64 com nt netsh html来自 PowerShell 我想看到这个命令的结果 例如一个对象 但是netsh返回一个字符串 netsh wlan show hostednetwork Ge
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • PHP 正则表达式匹配字符串的最后一次出现

    我的字符串是 text1 A373R12345 我想找到该字符串最后出现的非数字数字 所以我使用这个正则表达式 0 9 然后我得到这个结果 1 A373 2 12345 但我的预期结果是 1 A373R 它有 R 2 12345 另一个例子
  • 比较 ruby​​ 哈希值[重复]

    这个问题在这里已经有答案了 可能的重复 如何比较两个哈希值 https stackoverflow com questions 4928789 how do i compare two hashes 我有两个 ruby 哈希值 本质上是模型
  • 子文件夹和关系中的 Rails 模型

    我在自动加载的文件夹中组织了一些轨道模型 config autoload paths Dir Rails root join app models 我可以直接使用所有模型 例如Image first file name 但是当我尝试通过关系
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何处理 Nokogiri 中的 404 未找到错误

    我正在使用 Nokogiri 来抓取网页 很少有 url 需要猜测 当它们不存在时 会返回 404 未找到错误 有没有办法捕获这个异常 http yoursite page 38475 gt page number 38475 doesn
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 在 Rails 中本地化嵌套虚拟属性

    怎么可能本地化嵌套虚拟属性在 Rails 中 该模型 class User lt ActiveRecord Base attr accessor company information This is used in callbacks e
  • 在 Rails 项目中保存自定义异常定义的常规位置是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当创建自己的自定义异常时 例如 class ThingExploded lt StandardError end class ThingIsMi
  • 正则表达式库基准

    我最近一直想知道正则表达式实现的性能 并且很难想出很多有用的信息 它很容易对浏览器 javascript 正则表达式性能进行基准测试 网上有很多工具 Chrome 和 Opera 中的 javascript 正则表达式实现几乎摧毁了所有其他

随机推荐

  • 克隆 Git 存储库时 Packfile 被截断错误

    我在 Windows 上使用 Egit 和 Eclipse 来尝试从私有 Git 克隆存储库 它已连接 但在下载时出现 Packfile is truncated 错误 我的网络浏览器和文件资源管理器都已关闭 有谁知道是什么问题 org e
  • 在命令窗口中从 Windows 窗体应用程序获取退出代码

    我正在从命令提示符启动 Windows 窗体应用程序 并且需要获取 Windows 窗体应用程序生成的退出代码 命令 promt 启动应用程序并立即返回 但应用程序在后台执行 有没有办法获取退出代码 亲切的问候 基督教 答案是 start
  • 等待多个 jQuery Deferreds 中的第一个被解析?

    通过 jQuery 我知道我可以使用 when 等待all of多重Deferred待解决 或者第一个被拒绝的 但是有没有一种简单的方法可以同时触发多个Deferreds 然后等待第一个待解决 例如 我想尝试使用两个类似的 AJAX Web
  • .NET 4 WCF 内存问题

    我遇到了我的问题ASP NET 4 MVC 2 WCF应用程序使用大量内存Windows 2008 64 位应用程序在负载测试期间将耗尽几乎所有可用内存 8 GB 运行几分钟后 我们确实有几个工作进程在运行 分析后使用ANTS 内存分析器它
  • Magento 在模板文件中获取语言代码

    我需要一个辅助函数来获取当前的语言代码 我想在模板文件中使用它 例如 products view phtml 仅用于测试目的 它已经存在了吗 我有一些想法 比如 URL 助手 url this gt helper core url gt g
  • 尝试使用运行时共享库​​时出现“错误 #1014:找不到类 mx.core::BitmapAsset”

    我为我的项目创建了一个运行时共享库 我们将其称为 ResourceLibrary 它包含我的项目的所有嵌入资源 图像 声音 影片剪辑 并且在许多其他代码中用作单例 我正在使用这个批处理来编译它 不幸的是Windows SET normals
  • JSON 到 JQuery:我做错了什么?

    我对 javascript 和 jquery 开发相当陌生 我有一个用 PHP 获取的值表 并将其格式化为 JSON 字符串 因为 JSON 看起来是将数据输入 JavaScript 的好方法 但我在处理 javascript 变量时遇到了
  • R:数据框名称中的 Unicode 字符

    在 R for Windows 中 我可以按如下方式分配 unicode 字符 u lt U0444 1 但是 将字符串分配给数据框会产生不可读的输出 x lt data frame 1 setNames x u
  • Java 枚举 vs 迭代器 vs For 循环 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 枚举 迭代器 循环 之间有什么区别 在下面的代码中 每个示例 枚举 迭代器 循环 都获得相同的输出 但我需要知道它们之间真正的区别是什么 是否有
  • 比较文本字符串以查看它们是否匹配(允许轻微差异)

    我正在尝试比较两个来源的数据 ORIG Kick Ass Music From The Motion Picture ALT Kick A s Music from the Motion Picture ALT Kick Ass Music
  • YouTube 收藏数

    我正在使用 YouTube API 工作 玩 我可以使用 GetFavoriteFeed 为每个用户获取他们最喜欢的视频 但是是否可以获取相反的选项 我的意思是从视频中获取有多少次被标记为收藏夹 事实上 当您在视频上单击 收藏夹 时 如果您
  • 使用 android ndk 进行内存损坏调试

    当 void 函数返回到其调用者时 我的 Android 应用程序的本机部分出现了段错误 为了更好地可视化 我在被调用者函数的末尾放置了一条日志语句 并在调用者函数中放置了一条日志语句 紧接在调用被调用者之后 对不起 双关语 在 logca
  • 如何在“UIScrollview”中提供页面翻转效果?

    我正在开发一个正在使用的应用程序UIScrollview 因为我需要使用翻页效果 如何给翻页效果UIScrollview Note 在 UIScrollview 中 当我们更改页面时 向前和向后滚动页面 是否可以在滚动页面的同时赋予页面滚动
  • 将数组项复制到另一个数组中

    我有一个 JavaScript 数组dataArray我想将其推入一个新数组newArray 除非我不想newArray 0 to be dataArray 我想将所有项目推入新数组中 var newArray newArray pushV
  • Magento 添加步骤到单页结帐

    我正在尝试向单页结帐添加一个非常基本的 实际上只是一个带有一些文本和继续按钮的 div 步骤 但效果不佳 因为它们不起作用 我怀疑这是因为它们是在1 7 0 2 当遵循示例时这里 方蒂斯 http www fontis com au blo
  • 在 RealityKit 中导入多个 .usdz 对象并为其设置动画

    我有一个简单的 RealityKit 场景 显示一头 USDZ 牛 我看到了这些问题的几个答案 但我无法将它们实现到我的代码中 如何播放此文件中内置的动画 我如何才能将第二个物体 比如说一匹马 带入场景中 此外 我可以做些什么来清理我的代码
  • Chrome、Safari 忽略表格中的最大宽度

    我有这样的 HTML 代码 table style width 100 table
  • jQuery如何选择第一个非隐藏选择选项

    jQuery 1 9 和 1 10 之间的以下行为有所不同
  • 使用函数获取两个日期之间的日期列表

    我的问题类似于this https stackoverflow com questions 510012 get a list of dates between two datesMySQL 问题 但适用于 SQL Server 是否有函数
  • 与原子分组的混淆 - 它与 Ruby 正则表达式中的分组有何不同?

    我已经浏览了文档原子分组 http ruby doc org core 1 9 3 Regexp html method i named captures and rubyinfo http www regular expressions