正则表达式:捕获捕获组内的捕获组

2024-01-11

Intro

(您可以跳至如果什么...如果您对介绍感到厌倦)

这个问题并不是特别针对VBScript(我只是在这种情况下使用它):我想找到一个用于一般正则表达式使用(包括编辑器)的解决方案。

当我想创作一个改编版时,这一切就开始了示例 4,其中使用 3 个捕获组将数据拆分到 MS Excel 中的 3 个单元格中 https://stackoverflow.com/a/22542835/1326147。 我需要捕获一整个模式,然后在其中捕获其他 3 个模式。然而,在同一个表达式中,我还需要捕获另一种模式,并再次捕获其中的其他 3 个模式(是的,我知道......但在指指点点之前,请先完成阅读)。

我首先想到的是命名捕获组 http://www.regular-expressions.info/named.html然后我意识到我不应该«混合命名和编号的捕获组»自从它«不推荐,因为口味在组的编号方式上不一致».

然后我调查了VBScript 子匹配 http://www.regular-expressions.info/vbscript.html and «非捕获» groups http://www.regular-expressions.info/brackets.html我得到了针对特定案例的可行解决方案:

For Each C In Myrange
    strPattern = "(?:^([0-9]+);([0-9]+);([0-9]+)$|^.*:([0-9]+)\s.*:([0-9]+).*:([a-zA-Z0-9]+)$)"

    If strPattern <> "" Then
        strInput = C.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        Set rgxMatches = regEx.Execute(strInput)

        For Each mtx In rgxMatches
            If mtx.SubMatches(0) <> "" Then
                C.Offset(0, 1) = mtx.SubMatches(0)
                C.Offset(0, 2) = mtx.SubMatches(1)
                C.Offset(0, 3) = mtx.SubMatches(2)
            ElseIf mtx.SubMatches(3) <> "" Then
                C.Offset(0, 1) = mtx.SubMatches(3)
                C.Offset(0, 2) = mtx.SubMatches(4)
                C.Offset(0, 3) = mtx.SubMatches(5)
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        Next
    End If
Next

这是正则表达式的 Rubular 演示 http://www.rubular.com/r/8r6uUqfMSv。 在这些:

124;12;3
我的 id1:213 我的 id2:232 我的话:ins4yanrgx
:8587459 :18254182540215 :dcpt
0;1;2

It returns the first 2 cells with numbers and the 3rd with a number or a word. Basically I used a non-capturing group with 2 "parent" patterns ("parents" = broad patterns where I want to detect other sub-patterns). If the 1st parent pattern has a matching sub-pattern (1st capture group) then I place its value and the remaining captured groups of this pattern in the 3 cells. If not, I check if the 4th capture group (belonging to the 2nd parent pattern) was matched and place the remaining sub-patterns in the same 3 cells.

如果什么...

而不是这样的东西:

(?:^(\d+);(\d+);(\d+)$|^.*:(\d+)\s.*:(\d+).*:(\w+)$|what(ever))

像这样的事情是可能的:

(#:^(\d+);(\d+);(\d+)$)|(#:^.*:(\d+)\s.*:(\d+).*:(\w+)$)|(#:what(ever))

Where (#:而不是创建一个非捕获组,将创建一个“父”编号的捕获组。 这样我就可以做类似的事情实施例4 https://stackoverflow.com/a/22542835/1326147:

C.Offset(0, 1) = regEx.Replace(strInput, "#$1")
C.Offset(0, 2) = regEx.Replace(strInput, "#$2")
C.Offset(0, 3) = regEx.Replace(strInput, "#$3")

它将搜索父模式,直到在子模式中找到匹配项(将返回第一个匹配项,理想情况下,不会搜索其余匹配项)。

已经有这样的事情了吗?或者我完全错过了正则表达式中允许执行此操作的某些内容?

其他可能的变化:

  • 直接引用父子模式,例如:#2$3(这相当于$6以我的例子为例);
  • create as many capturing groups as necessary within others (I guess it would be more complex but also the most interesting part as well), e.g.: with regex (same syntax) like (#:^_(?:(#:(\d+):\w+-(\d))|(#:\w+:(\d+)-(\d+)))_$)|(#:^\w+:\s+(#:(\w+);\d-(\d+))$) and fetching ##$1 in patterns like:

    _123:smt-4_它将匹配:123
    _ott:432-10_它将匹配:432
    yant: special;3-45235它将匹配:special

如果您发现此逻辑有任何错误或缺陷,请告诉我,我会尽快编辑。


这通常是要捕获大部分相同数据的情况。
唯一的区别在于形式。

有一个名为“分支重置”的正则表达式构造。
大多数 Perl 兼容引擎都提供它。不是 Java 也不是 Dot Net。
它主要只是节省正则表达式资源并使处理匹配变得更容易。

您提到的替代方案不会有任何帮助,它实际上只是使用
更多资源。您仍然需要查看匹配的内容才能了解您所在的位置。
但您只需检查集群中的一组即可知道其他组是哪一个
组是有效的(

(下面是使用构建的 正则表达式格式 6 http://www.regexformat.com)

这是分支重置版本:

 # (?|^(\d+);(\d+);(\d+)$|^.*:(\d+)\s.*:(\d+).*:(\w+)$|what(ever)()())

 (?|
      ^ 
      ( \d+ )                       # (1)
      ;
      ( \d+ )                       # (2)
      ;
      ( \d+ )                       # (3)
      $ 
   |  
      ^ .* :
      ( \d+ )                       # (1)
      \s .* :
      ( \d+ )                       # (2)
      .* :
      ( \w+ )                       # (3)
      $ 
   |  
      what
      ( ever )                      # (1)
      ( )                           # (2)
      ( )                           # (3)
 )

这是你的两个正则表达式。请注意,“父级”捕获实际上增加了组的数量(这会减慢引擎的速度):

 # (?:^(\d+);(\d+);(\d+)$|^.*:(\d+)\s.*:(\d+).*:(\w+)$|what(ever))

 (?:
      ^ 
      ( \d+ )                       # (1)
      ;
      ( \d+ )                       # (2)
      ;
      ( \d+ )                       # (3)
      $ 
   |  
      ^ .* :
      ( \d+ )                       # (4)
      \s .* :
      ( \d+ )                       # (5)
      .* :
      ( \w+ )                       # (6)
      $ 
   |  
      what
      ( ever )                      # (7)
 )

and

    # (#:^(\d+);(\d+);(\d+)$)|(#:^.*:(\d+)\s.*:(\d+).*:(\w+)$)|(#:what(ever))

    (                             # (1 start)
         \#: ^ 
         ( \d+ )                       # (2)
         ;
         ( \d+ )                       # (3)
         ;
         ( \d+ )                       # (4)
         $ 
    )                             # (1 end)
 |  
    (                             # (5 start)
         \#: ^ .* :
         ( \d+ )                       # (6)
         \s .* :
         ( \d+ )                       # (7)
         .* :
         ( \w+ )                       # (8)
         $ 
    )                             # (5 end)
 |  
    (                             # (9 start)
         \#:what
         ( ever )                      # (10)
    )                             # (9 end)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式:捕获捕获组内的捕获组 的相关文章

  • 如何让“grep -zoP”单独显示每个匹配项?

    我有一个此表格的文件 X this is the first match blabla X this is the second match and here we have some fluff 我想提取 X 之后和相同标记之间出现的所有
  • Python RE(总之检查第一个字母是否区分大小写,其余部分不区分大小写)

    在下面的情况下 我想匹配字符串 Singapore 其中 S 应始终为大写 其余单词可能为小写或大写 但在下面的字符串 s 是小写的 它在搜索条件中匹配 任何人都可以让我知道如何实施吗 import re st Information in
  • 需要正则表达式(使用 C#)将所有空白压缩为单个空白

    我需要将文档中的多个空格替换为单个空格 每次迭代 无论它们是空格 制表符还是换行符 任何类型的空格的任何组合都需要被截断为单个空格 假设我们有字符串 Hello t t n t n world 其中 t 和 n 分别代表制表符和换行符 那么
  • 使用 sed 删除非字母数字字符

    我正在尝试验证一些输入以删除一组字符 只允许使用字母数字字符加 句点 下划线 连字符 我测试了正则表达式 w here http gskinner com RegExr http gskinner com RegExr 它与我想要删除的内容
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 正则表达式,选择最接近的匹配

    假设以下单词序列 BLA text text text text text text BLA text text text text LOOK text text text BLA text text BLA 我想做的是将 BLA 中的文本
  • preg_match 所有以@开头的单词?

    我对正则表达式不太确定 所以我不得不问你 如何用 PHP 判断字符串中是否包含以 开头的单词 例如我有一个像 This is for codeworxx 这样的字符串 我很抱歉 但我没有任何起点 希望你能帮忙 谢谢 萨沙 好的 谢谢你的结果
  • php 或 zend 中国际电话号码验证的正则表达式是什么?

    我有一个 zend 表单 其中有一个电话号码字段 并且必须检查验证器 我决定为此使用正则表达式 我搜索了谷歌 但我得到的结果不起作用 谁能给我提供正则表达式 这是我的代码 phone new Zend Form Element Text p
  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo
  • 你能挽救我的负面回顾示例来传达数字吗?

    在 高级正则表达式 一章中掌握 Perl http oreilly com catalog 9780596527242 我有一个损坏的示例 我无法找到一个很好的修复方法 这个例子可能为了自己的利益而试图变得太聪明 但也许有人可以帮我解决它
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

    我所做的是从开头删除 92 或 0092 并使用以下代码检查它是否是巴基斯坦人的有效手机号码 if preg match 3 0 4 0 9 number 1 Pakistani mobile number else not a pakis
  • 什么是仅匹配空字符串的正则表达式?

    有很多关于正则表达式的帖子来匹配潜在地空字符串 但我找不到任何提供正则表达式的字符串only匹配一个空字符串 我知道 将匹配任何行的开头并且 将匹配任何行的结尾以及字符串的结尾 像这样 匹配的内容远不止空字符串 如 n foobar n n
  • PHP解析xml文件错误

    我正在尝试使用 simpleXML 来获取数据http rates fxcm com RatesXML http rates fxcm com RatesXML Using simplexml load file 我有时会遇到错误 因为这个
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 从 html 属性中删除单引号和双引号,并且除 href 和 src 之外的所有属性上都没有空格

    我正在尝试从 html 属性中删除单引号和双引号 这些属性是没有空格的单个单词 我写了这个有效的正则表达式 type title data toggle colspan scope role media name rel id class
  • Python 非贪婪正则表达式

    我如何制作一个像这样的Python正则表达式 这样 给定 a b c d e 蟒蛇匹配 b 代替 b c d 我知道我可以使用 代替 但我正在寻找一种更通用的解决方案 使我的正则表达式更加干净 有没有办法告诉python 嘿 尽快匹配这个
  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l

随机推荐

  • 隐含卸载应用程序的意图?

    我试图让 onclicklistener 调用卸载应用程序的意图 方法是让该意图从应用程序设置中调用默认的 卸载应用程序 活动 我已经发现here http developer android com reference android c
  • 应用程序突然关闭时堆内存清理

    众所周知 堆用于为应用程序动态分配内存 在应用程序异常终止的情况下 如何清除堆内存 从而避免内存泄漏 考虑以下场景 假设某个应用程序在 Windows 或 Linux 上突然崩溃 我们在 Linux 中强制终止一个应用程序 kill 9
  • 未找到规则“re​​act/require-extension”的定义

    我已经开始使用 Atom 来工作 React native 当我从 Atom 打开 index js 时 我收到错误 例如代码行顶部的 未找到规则 react require extension 的定义 我认为 无法导入 format 我不
  • event.target 在事件中未定义

    一个人如何使用each输入值events 希望我的下面的代码能很好地解释你 HTML
  • Pandas - 将分类列转换为二进制编码形式

    我有一个数据集 看起来像这样 yyyy month tmax tmin 0 1908 January 5 0 1 4 1 1908 February 7 3 1 9 2 1908 March 6 2 0 3 3 1908 April 7 4
  • 如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

    USER ID string col 100001 Here 100001 there 100001 Apple 200002 this is 200002 that is 200002 Apple 200002 Cell 4 这是我的原始
  • 继续黑屏。以前从未见过这个

    我正在 Xcode 5 0 2 中为 iOS7 制作一个演示 并连接了一些场景并有一些按钮 一些视图控制器类和一些转场 没什么不寻常的 我以前从未见过的是 在某些构建上 当执行转场时 下一个视图控制器在推送后会间歇性地全黑 但并非总是如此
  • Laravel 5.3 安装错误

    我正在尝试启动本地托管在我的浏览器上的 laravel 但它给了我以下错误 解析错误 语法错误 意外的 期望 或变量 T VARIABLE 在 opt lampp htdocs projects larawiz vendor laravel
  • [if lt IE 9] 的 Slim 模板引擎语法

    我使用 slim 作为视图模板引擎http slim lang com http slim lang com 你会如何用 slim 编写下面的代码 thanks 应该使用 if lt IE 9 gt
  • 从字符串中提取Python字典

    我有一个字符串 里面有有效的 python 字典 data Some string created Foo u 1002803 Bar value string continue etc 我需要提取该字典 我尝试使用正则表达式 但由于某种原
  • 如何在 C 中访问(动态分配的)Fortran 数组

    我的主要问题是为什么数组会做如此奇怪的事情 以及是否有任何方法可以以 干净 的方式执行以下操作 我目前有一个C程序foo c连接 Fortran 程序bar f90 via dlopen dlsym 大致如下面的代码所示 foo c inc
  • 无法连接到远程服务器上的mongo

    我已经在machine1上安装了mongo Ubuntu 14 04 3 LTS server 在我的本地网络中 我也打开了端口27017如中提到的this https docs mongodb org manual tutorial co
  • android 卸载应用程序后保留数据库

    我正在开发 sq lite 数据库 可以在其中找到三星设备中的问题 当我卸载应用程序时 Android 操作系统会保留导致数据库版本冲突的数据库 以前我使用版本 2 现在我使用版本 1 作为参数sqllitehelper构造函数 按照惯例
  • Tensorflow.js 加载增强层操作时出错

    我通过 python 中的张量流训练了一个模型 使用将图像增强合并到模型层中 但是 当我将训练好的模型转换为tensorflow js model json 并运行它时 出现错误 jquery 3 3 1 slim min js 2 Unc
  • 如何在 Zend Framework 中创建 Web 服务?

    如何使用 Zend Framework 通过 HTTP REST 协议创建 Web 服务 示例代码将会很有用 要调用此 Web 服务 请使用以下参数打开保存此 PHP 文件的 URL 这将给出输出 Hello world Test
  • 使用 FineUploader 向 Amazon S3 提供标头

    我正在使用 FineUploader 将文件上传到 Amazon S3 我想添加Content Disposition文件头 我已经尝试过这个 在 CoffeeScript 中 request endpoint accessKey cust
  • 拨号 tcp 查找:docker windows 桌面上没有此类主机问题

    我已经在我的办公室 Windows 10 Pro 机器上安装了 docker 我在尝试从注册表中提取数据时遇到拨号 tcp 查找问题 来自守护进程的错误响应 获取https registry 1 docker io v2 https reg
  • 如何在 C# 中使用 p/invoke 将指针传递给数组?

    C API 签名示例 void Func unsigned char bytes 在 C 中 当我想将指针传递给数组时 我可以这样做 unsigned char bytes new unsigned char 1000 Func bytes
  • Azure CLI aks install cli 权限被拒绝并且 sudo 不起作用

    我正在尝试奔跑az aks install cli但我收到一条错误消息 Downloading client to usr local bin kubectl from https storage googleapis com kubern
  • 正则表达式:捕获捕获组内的捕获组

    Intro 您可以跳至如果什么 如果您对介绍感到厌倦 这个问题并不是特别针对VBScript 我只是在这种情况下使用它 我想找到一个用于一般正则表达式使用 包括编辑器 的解决方案 当我想创作一个改编版时 这一切就开始了示例 4 其中使用 3