gpt4 book ai didi

regex - "(?x::"在Boost regex替换中是什么意思,其中 "x"是数字吗?

转载 作者:行者123 更新时间:2023-12-04 03:52:27 25 4
gpt4 key购买 nike

这是一种Perl样式的正则表达式,可在Sublime Text 2的Ruby包的其中一个片段文件中找到:

/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g

我知道它可以将“some_class.rb”之类的文件名转换为“SomeClass”,但是我不知道这部分是做什么的: (?2::。 Sublime Text 2在其正则表达式中使用了boost,因此我检查了 Boost-Extended Format String Syntax的文档,发现boost支持格式字符串(f.inst。 (?2(foo):(bar)))中的条件,但是您将不需要两个冒号。此外, ?2将指向第二个子表达式,但是上面的表达式只匹配一个子表达式。由于这些原因,我认为这不是条件表达式。

感谢您的启发性回答。

最佳答案

首先,(?2::\u$1)的替换侧上的///g不是Perl。这是Boost自己的扩展程序

  • 参见OP提到的[Search and Replace Format String Syntax> Boost-Extended Format String Syntax]。

  • 说到该文件,

    The character '?' begins a conditional expression, the general form is:

    ?Ntrue-expression:false-expression

    where N is decimal digit.

    If sub-expression N was matched, then true-expression is evaluated and sent to output, otherwise false-expression is evaluated and sent to output.



    基于此,让我们分析神秘的 (?2::\u$1)
  • ?2始终为false,因为没有第二个捕获组。
  • 第一个:true-expression中的“特殊字符”,表示空字符串
  • 如果我们假设true-expression不能为空,则第一个:不会被解释为true和false表达式之间的分隔符(有关多刺/多汁的详细信息,请阅读附录D )。
  • 实际上,我们可以将所需的任何内容都放入true-expression(只要中间没有:,因为?2永远不会评估为true)。
  • \u$1false-expression

  • 把两个和两个放在一起,我要弯腰说

    /(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g

    只是一种混淆的方法:

    /(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/\u$1/g

    附录D:Sublime Text 2中的代码段实验

    所以我用这个内容定义了Sublime Text 2片段

    <snippet>
    <content><![CDATA[
    snakecase: ${1:hello_world}
    camelcase: ${1/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g}
    ]]></content>
    <tabTrigger>convert</tabTrigger>
    </snippet>

    并用不同的表达方式代替右侧。

    给定输入 hello_world
  • 如果右侧是(?2::\u$1),则返回HelloWorld
  • 如果右侧是(?2:\u$1),则返回HW
  • 如果右侧是(?2:$1),则不返回任何内容
  • 如果右侧是(?2:::\u$1),则返回:Hello:World
  • 如果右侧是(?1:\u$1),则返回HelloWorld
  • 如果右侧是(?1::\u$1),则返回HW
  • 如果右侧是(?1::$1),则不返回任何内容
  • 如果右侧是(?1:::\u$1),则返回HW
  • 如果右侧是(?1:::$1),则不返回任何内容
  • 如果右侧是\u$1,则返回HelloWorld

  • 基于此的一些初步结论(假设案例2、6、8是异常†)
  • 如果仅在数字后面跟随一个冒号(:),则会将其忽略(即,不会将其解释为true和false表达式之间的分隔符)。
  • 如果数字后接2个冒号(::),则true-expression为空字符串(第二个:为分隔符)
  • 如果后跟数字3个冒号(:::),true-expression是一个空字符串,并且false-expression以文字冒号开头(第二个:是分隔符)
  • 比较案例1和10,我对(?2::\u$1)\u$1等效的结论仍然成立。

  • †我说过异常是因为 \u$1的行为与 $1相比有很大不同(除了捕获的子字符串的第一个字符,所有其他字符都消失了)

    关于regex - "(?x::"在Boost regex替换中是什么意思,其中 "x"是数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320852/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com