你能挽救我的负面回顾示例来传达数字吗?

2024-05-16

在“高级正则表达式”一章中掌握 Perl http://oreilly.com/catalog/9780596527242,我有一个损坏的示例,我无法找到一个很好的修复方法。这个例子可能为了自己的利益而试图变得太聪明,但也许有人可以帮我解决它。里面可能有这本书的免费副本,用于修复工作。 :)

在讨论环视的部分中,我想使用负环视来实现带有小数部分的数字的通信例程。重点是使用负面回顾,因为这就是主题。

我愚蠢地这样做了:

$_ = '$1234.5678';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g;  # $1,234.5678

The (?<!\.\d)断言之前的位(?=(?:\d\d\d)+\b)不是小数点和数字。

愚蠢的事情是没有足够努力去打破它。通过在末尾添加另一个数字,现在有一组前面没有小数点和数字的三位数字:

$_ = '$1234.56789';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g;  # $1,234.56,789

如果 Perl 中的后视可以是可变宽度,那么这将非常容易。但他们不能。

请注意,在没有负向后查找的情况下很容易做到这一点,但这不是示例的重点。有办法挽救这个例子吗?


我认为如果没有某种形式的可变宽度后视是不可能的。添加的\K5.10 中的断言提供了一种伪造可变宽度正向后查找的方法。我们真正需要的是可变宽度negative向后看,但只要有一点创造力和很多丑陋,我们就可以让它发挥作用:

use 5.010;
$_ = '$1234567890.123456789';
s/(?<!\.)(?:\b|\G)\d+?\K(?=(?:\d\d\d)+\b)/,/g;
say;  # $1,234,567,890.123456789

如果有一种模式需要/x符号就是这个:

s/
  (?<!\.)        # Negative look-behind assertion; we don't want to match
                 # digits that come after the decimal point.

  (?:            # Begin a non-capturing group; the contents anchor the \d
                 # which follows so that the assertion above is applied at
                 # the correct position.

    \b           # Either a word boundary (the beginning of the number)...

    |            # or (because \b won't match at subsequent positions where
                 # a comma should go)...

    \G           # the position where the previous match left off.

  )              # End anchor grouping

  \d+?           # One or more digits, non-greedily so the match proceeds
                 # from left to right. A greedy match would proceed from
                 # right to left, the \G above wouldn't work, and only the
                 # rightmost comma would get placed.

  \K             # Keep the preceding stuff; used to fake variable-width
                 # look-behind

                 # <- This is what we match! (i.e. a position, no text)

  (?=            # Begin a positive look-ahead assertion

    (?:\d\d\d)+  # A multiple of three digits (3, 6, 9, etc.)

    \b           # A word (digit) boundary to anchor the triples at the
                 # end of the number.

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

你能挽救我的负面回顾示例来传达数字吗? 的相关文章

随机推荐

  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 将productFlavor添加到实验性Android gradle插件库

    我有一个使用实验性 gradle 插件的项目 即0 2 0 当我没有了productFlavor 我可以在Android Studio中完美集成一个库模块 一切都运行良好 但是当图书馆有一个productFlavor 我的主项目没有找到库类
  • 获得新的 access_token 后,如何更新我的 cookie?

    使用刷新令牌获取新的访问令牌后 我想使用该访问令牌更新我的客户端 cookie 我的客户端能够使用 ajax 登录并调用我的 REST API 但是当第一次授权过期时 API 调用自然不再起作用 我有一个 NET Web 应用程序 它使用自
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 从捆绑包中检索 android.intent.extra.EMAIL 值

    我创建了一个应用程序 例如电子邮件客户端应用程序 例如Gmail 当用户单击其他应用程序中的电子邮件地址并从列表中显示的电子邮件发送应用程序中选择我的应用程序时 电子邮件内容 例如电子邮件地址 电子邮件主题等 有意进入我的应用程序 但问题是
  • PHP:STR 替换为链接

    我有这个 PHP 聊天框 如果我在聊天框中键入链接 它不会将其显示为链接 我如何使用 STR 替换来执行此操作 它应该响应诸如 http http com nl www www 之类的内容 我的其他 STR 替换行如下所示 bericht
  • 对于 AWS Kinesis 的 KCL Java 库,如何使用 requestShutdown 和 shutdown 正常关闭

    我正在尝试使用 Java 中 KCL 库的新功能来实现 AWS Kinesis 的正常关闭 方法是注册关闭钩子以停止所有记录处理器 然后正常停止工作进程 新库提供了记录处理器需要实现的新接口 但它是如何被调用的呢 尝试先调用worker r
  • 在 JavaScript 中对字符串使用除法运算符 (/)

    我意识到在javascript中所有101 100 101 100 101 100 和 101 100 结果都是1 01 在Chrome FF和IE11上检查 但我找不到有关此行为的文档 因此我的问题是使用此功能是否 跨浏览器 安全 以及这
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • SQL Server中的列级与表级约束?

    A 列级 GO CREATE TABLE Products ProductID INT CONSTRAINT pk products pid PRIMARY KEY ProductName VARCHAR 25 GO b 表层 CREATE
  • C# WinForms:使用一个或多个附加线程进行绘图。如何?

    如果我有一张包含各种几何形式 直线 矩形 圆形等 的大图 线程需要花费大量时间来绘制所有内容 但在现实生活中 一栋建筑是由不止一名工人建造的 因此 如果绘图是建筑物而线程是构建者 则绘制速度会快得多 但我想知道怎么做 你能告诉我怎么做吗 有
  • 用 Pandas 计算该月的最后一个星期五

    我编写了这个函数来获取该月的最后一个星期四 def last thurs date date month date dt month year date dt year cal calendar monthcalendar year mon
  • 同一页面上具有不同ajax源的多个DataTable

    我在一个页面上有几个表格 使用数据表 http datatables net 每个都需要有自己的 sAjaxSource 我似乎无法确切地弄清楚如何做到这一点 这是我拥有的最少代码 var oTable datatable dataTabl
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • C++ 装饰器模式,模板的静态多态性和注册回调方法

    我正在尝试使用静态多态性来创建装饰器模式 至于为什么我不使用动态多态 请看这个QA https stackoverflow com questions 39312070 c dynamic cast over decorator insta
  • 在脚本标签内工作的角度表达式

    如何在脚本标签内使用角度表达式 我对此很陌生并且需要帮助 这是我的 java 脚本代码的示例
  • Python中两个元组中的元素之间的组合[重复]

    这个问题在这里已经有答案了 我有两个元组 t1 A B t2 C D E 我想知道如何在元组之间创建组合 所以结果应该是 AC AD AE BC BD BE EDIT Using list itertools combinations ab
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • bash 支持字边界正则表达式吗?

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

    在 高级正则表达式 一章中掌握 Perl http oreilly com catalog 9780596527242 我有一个损坏的示例 我无法找到一个很好的修复方法 这个例子可能为了自己的利益而试图变得太聪明 但也许有人可以帮我解决它