在正则表达式替换中捕获字符串

2023-12-23

根据我从 Pharo 正则表达式文档中收集到的信息,我可以定义一个正则表达式对象,例如:

re := '(foo|re)bar' asRegex

我可以通过以下方式将匹配的正则表达式替换为字符串:

re copy: 'foobar blah rebar' replacingMatchesWith: 'meh'

这将导致:“meh blah meh”。

到目前为止,一切都很好。但我想更换'bar'并保留前缀。因此,我需要一个变量来处理捕获的括号:

re copy: 'foobar blah rebar' replacingMatchesWith: '%1meh'

我想要结果:'foomeh blah remeh'。然而,这只是给了我:'%1meh blah %1meh'。我也尝试过使用\1, or \\1, or $1, or {1}并得到文字字符串替换,e.g., '\1meh blah \1meh'因此。

我可以在 GNU Smalltalk 中轻松地做到这一点:

'foobar blah rebar' replacingAllRegex: '(foo|re)bar' with: '%1meh'

但我在 Pharo 正则表达式文档中找不到任何地方告诉我如何在 Pharo 中执行此操作。我也用谷歌搜索了 Pharo 正则表达式,但没有找到任何东西。此功能是 RxMatcher 类或其他 Pharo 正则表达式类的一部分吗?


经过一番尝试后RxMatcher类中,我对RxMatcher#copyStream:to:replacingMatchesWith:选择器:

copyStream: aStream to: writeStream replacingMatchesWith: aString
    "Copy the contents of <aStream> on the <writeStream>,
     except for the matches. Replace each match with <aString>."

    | searchStart matchStart matchEnd |
    stream := aStream.
    markerPositions := nil.
    [searchStart := aStream position.
    self proceedSearchingStream: aStream] whileTrue: [ | ws rep |
        matchStart := (self subBeginning: 1) first.
        matchEnd := (self subEnd: 1) first.
        aStream position: searchStart.
        searchStart to: matchStart - 1 do:
            [:ignoredPos | writeStream nextPut: aStream next].

        "------- The following lines replaced: writeStream nextPutAll: aString ------"
        "Do the regex replacement including lookback substitutions"
        writeStream nextPutAll: (aString format: self subexpressionStrings).
        "-------"

        aStream position: matchEnd.
        "Be extra careful about successful matches which consume no input.
        After those, make sure to advance or finish if already at end."
        matchEnd = searchStart ifTrue: 
            [aStream atEnd
                ifTrue: [^self "rest after end of whileTrue: block is a no-op if atEnd"]
                ifFalse:    [writeStream nextPut: aStream next]]].
    aStream position: searchStart.
    [aStream atEnd] whileFalse: [writeStream nextPut: aStream next]

然后是“访问”类别:

subexpressionStrings
   "Create an array of lookback strings"
   | ws |
   ws := Array new writeStream.
   2 to: (self subexpressionCount) do: [ :n | | se |
      ws nextPut: ((se := self subexpression: n) ifNil: [ '' ] ifNotNil: [ se ]) ].
   ^ws contents.

通过此修改,我可以使用 Smalltalk 在替换字符串中进行回顾String#format:参数模式:

re := '((foo|re)ba(r|m))' asRegex
re copy: 'foobar meh rebam' replacingMatchesWith: '{2}bu{3} (was {1})'

结果是:

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

在正则表达式替换中捕获字符串 的相关文章

  • 需要正则表达式(使用 C#)将所有空白压缩为单个空白

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

    我在页面上有以下代码 span class release date i class fa fa calendar i 2014 11 16 span This 2014 11 16是日期 由我的 CMS 自动生成 我需要更改这个日期 基本
  • 正则表达式,选择最接近的匹配

    假设以下单词序列 BLA text text text text text text BLA text text text text LOOK text text text BLA text text BLA 我想做的是将 BLA 中的文本
  • 正则表达式将单词的开头和结尾与元音匹配

    我正在尝试以下操作Regex aeiou aeiou 但它不起作用 我测试了 abcda 并且不匹配 它应该只是 aeiou aeiou 额外的 您需要第二个字符是一个文字点 例如 a hello 但由于您的测试用例 abcda 不包含这样
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 如何从 pandas 数据框中的列中删除字符串值

    我正在尝试编写一些代码 以逗号分隔数据帧列中的字符串 因此它成为一个列表 并从该列表中删除某个字符串 如果存在 删除不需要的字符串后 我想再次以逗号加入列表元素 我的数据框如下所示 df Column1 Column2 0 a a b c
  • 正则表达式验证字符串是否包含三个非空白字符

    我使用欧芹 js 来验证输入 并且使用 data parsley pattern 它允许我传递正则表达式 我正在尝试验证该字符串以确保它至少包含三个非空白字符 下面是应该无效或有效的字符串 valid 1 2 b invalid 1 b s
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

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

    有很多关于正则表达式的帖子来匹配潜在地空字符串 但我找不到任何提供正则表达式的字符串only匹配一个空字符串 我知道 将匹配任何行的开头并且 将匹配任何行的结尾以及字符串的结尾 像这样 匹配的内容远不止空字符串 如 n foobar n n
  • 具有连字符的 Oracle 正则表达式在 Windows 上给出的结果与在 Unix 上不同

    我有以下带有正则表达式的查询 select REGEXP REPLACE TEST 3304 V2 lt gt as REG from dual 当通过 SQL Plus 在Windows机器返回以下内容 SQL gt select REG
  • Grep 和 Python

    我需要一种通过 Unix 命令行中的正则表达式使用 grep 搜索文件的方法 例如 当我在命令行中输入 python pythonfile py RE file to be searched 我需要正则表达式 RE 在文件中搜索并打印出匹配
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 从正则表达式对象中提取允许字符串的最大长度

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

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

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 正则表达式,如果模式在引号中则忽略模式

    编写一个非常简单的脚本解析器作为学校项目的一部分 虽然这不是必需的 但我很好奇是否可以仅使用正则表达式来完成 语法类似于 ASP 其中脚本以 结尾 它只支持一个命令 pr 与echo或Response Write相同 现在我正在使用这个正则
  • Python 中的 grep 等价物是什么?

    假设我有一个文本文件 其中包含 我喜欢大象 这一行 如果我捕获所述文件并将其通过管道发送到 grep大象 我会得到整行 我喜欢大象 如何使用 re 在 Python 中实现此功能 我一直在尝试以下方法 test re search elep
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 使用正则表达式搜索 Ruby 数组

    你好 我有一个小的 ruby 函数 它可以分割出一个 Ruby 数组 如下所示 def rearrange arr from to sidx arr index from eidx arr index to arr sidx arr sid

随机推荐

  • 比较 Java8 中的 Instant

    我有这个对象 public class MatchEvent implements Serializable private static final long serialVersionUID 1L Id GeneratedValue s
  • max-width:auto == max-width:100% 吗?

    Is max width auto equal to max width 100 如果不是 有什么区别 他们不平等 auto不是有效值max width 如果您正在寻找一个表示 该元素的宽度没有上限 的值 则该值是none 参见规格max
  • 空检查对象中的解构变量

    我有下面所示的解构代码end time财产来自this props auction object const auction auction end time this props 但这里的问题是 如果拍卖是空对象 则上述常量将是未定义的
  • Swift WKWebView:调用方法时找不到变量错误

    我正在尝试将 GPS 坐标传递给方法调用setIOSNativeAppLocation 我有下面的代码 但我收到此错误 A JavaScript exception occurred UserInfo WKJavaScriptExcepti
  • Typescript 中的对象平等[重复]

    这个问题在这里已经有答案了 我正在打字稿中的向量上创建一个库 我的第一次测试失败了 它与 TypeScript JavaScript 中的对象相等有关 但我找不到一种方法来使测试变得绿色 Typescript 的官方文档中没有提到对象相等性
  • 如何在高图表中超链接条形图

    我有一个 highcharts 可以根据数据库中的数据呈现数据 我使用的是 bar 类型 现在我希望当用户单击该栏时 它将重定向到特定页面或例如另一个网站 我已经用谷歌搜索但无法得到答案 这是我正在使用的代码 function var ch
  • 以编程方式删除 field_group

    我在 Drupal 7 中有一个名为 group imagecache 的 field group 我如何以编程方式删除它 我尝试阅读代码 似乎它使用了 ctools 但我宁愿不使用 ctools ctools 是 field group
  • 仅在 spock 中基于调用次数模拟方法的返回

    是否可以根据调用方法的第 n 次来模拟 spock 中方法的返回值 请注意 我不想指定传入的参数 因为它对于特定的测试用例并不重要 例如 对于第一次调用 它应该返回 x 对于第二次调用 它应该返回 y 对的 这是可能的 someObject
  • 云存储桶中的公共对象无法通过负载均衡器访问

    我为我的 Google Cloud Storage 存储桶设置了 CDN 我已经上传了一个公共对象 您可以通过此处的公共链接查看它 https storage googleapis com staging twinkle 4acfc app
  • PlayFramework 2 + Ebean - 原始 Sql 更新查询 - 对数据库没有影响

    我有一个 play Framework 2 0 4 应用程序想要修改数据库中的行 我需要将数据库中的 少数 消息更新为 已打开 状态 读取消息 我做了如下 String sql UPDATE message SET opened true
  • 为什么 Pandas 默认会迭代 DataFrame 列?

    尝试了解 Pandas 某些功能背后的设计原理 如果我有一个包含 3560 行和 18 列的 DataFrame 那么 len frame 是3560 但是 len a for a in frame is 18 也许对于来自 R 的人来说这
  • MySQL 事务难题

    我需要在单个原子事务中执行多次插入 例如 开始交易 插入 插入 commit 然而 当 MySQL 遇到错误时 它只会中止导致错误的特定语句 例如 如果第二个插入语句中有错误 提交仍然会发生 并且第一个插入语句将被记录 因此 当发生错误时
  • 如何处理使用相同库的许多 Web 应用程序的共享库

    我们有一个用 Java 制作的 Web 应用程序 它使用了 struts2 spring 和 JasperReport 该应用程序在 glassfish 4 0 上运行 应用程序的库位于 WEB INF lib 文件夹中 并且在 glass
  • 一次性渲染到完整的 3D 渲染目标

    使用 DirectX 11 我创建了一个可以绑定为渲染目标的 3D 体积纹理 D3D11 TEXTURE3D DESC texDesc3d texDesc3d Usage D3D11 USAGE DEFAULT texDesc3d Bind
  • 适用于 Windows 8 Metro 应用程序的免费 PDF 编写器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Rails 和 标签

    我对 Ruby on Rails 相当陌生 我正在尝试使用 滑动门 技术创建一些精美的 CSS 按钮 我几乎可以正常工作了 但我觉得必须有更好的方法来处理链接的标签 我目前正在做的方式 这本身并不可怕 但我想知道这是否是在 RoR 中处理跨
  • 为什么 Windows 32 位称为 Windows x86 而不是 Windows x32? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Windows 操作系统可以是 32 位或 64 位 这64 bit版本称为Windows x64但是32 bit版本称为Windows
  • 使用 Anaconda 下载 Random.py

    我正在尝试下载随机模块 想知道是否复制代码并将其放入文件编辑器中 如何通过 pip 安装它 我将代码放在记事本中 并将其保存在桌面上 名称为 random py 我现在该怎么做才能通过 anaconda 安装它 我尝试了 pip insta
  • Django:扩展用户模型与创建用户配置文件模型

    我正在 Django 中创建一个应用程序 到目前为止我一直在使用扩展用户模型 如下所示 class MyUser AbstractBaseUser 包含所有用户和个人资料信息 但我看到很多人在堆栈溢出上为个人资料和用户本身创建不同的模型 使
  • 在正则表达式替换中捕获字符串

    根据我从 Pharo 正则表达式文档中收集到的信息 我可以定义一个正则表达式对象 例如 re foo re bar asRegex 我可以通过以下方式将匹配的正则表达式替换为字符串 re copy foobar blah rebar rep