当前位置: 首页 > 知识库问答 >
问题:

替换字符的奇数长度子字符串

王棋
2023-03-14

我正在努力解决一个关于正则表达式的小问题。

我想用另一个长度相同但字符不同的子字符串替换特定字符的所有奇数长度子字符串。指定字符的所有偶数序列应保持不变。

一个字符串包含字母a、b和y,y的所有奇数长度序列都应替换为z:

abyyyab -> abzzzab

另一个可能的例子是:

ycyayybybcyyyyycyybyyyyyyy   

变成

zczayybzbczzzzzcyybzzzzzzz

使用正则表达式匹配所有奇数长度的序列没有问题。

不幸的是,我不知道如何将这些匹配的长度信息合并到替换字符串中。我知道我必须以某种方式使用反向引用/捕获组,但即使在阅读了大量文档和堆栈溢出文章之后,我仍然不知道如何正确地处理这个问题。

关于可能的正则表达式引擎,我主要使用Emacs或Vim。

如果我忽略了一个没有复杂正则表达式的更简单的通用解决方案(例如,一系列小的固定的简单搜索和替换命令),这也会有所帮助。

共有1个答案

巫朝明
2023-03-14

下面是我在vim中的实现方式:

:s/\vy@<!y(yy)*y@!/\=repeat('z', len(submatch(0)))/g

说明:

我们使用的正则表达式\vy@

这个搜索的基本思想是,我们要寻找一个'y'y,后面跟着一对'y's,(yy)*。然后我们添加y@

然后我们使用eval寄存器替换它,即\=。从:h子替换-\=

                        *sub-replace-\=* *s/\=*
When the substitute string starts with "\=" the remainder is interpreted as an
expression.

The special meaning for characters as mentioned at |sub-replace-special| does
not apply except for "<CR>".  A <NL> character is used as a line break, you
can get one with a double-quote string: "\n".  Prepend a backslash to get a
real <NL> character (which will be a NUL in the file).

The "\=" notation can also be used inside the third argument {sub} of
|substitute()| function.  In this case, the special meaning for characters as
mentioned at |sub-replace-special| does not apply at all. Especially, <CR> and
<NL> are interpreted not as a line break but as a carriage-return and a
new-line respectively.

When the result is a |List| then the items are joined with separating line
breaks.  Thus each item becomes a line, except that they can contain line
breaks themselves.

The whole matched text can be accessed with "submatch(0)".  The text matched
with the first pair of () with "submatch(1)".  Likewise for further
sub-matches in ().

TL; DR,: s/foo/\=blah将foo替换为评估为vimcript代码的blah。因此,我们正在计算的代码是重复('z', len(子匹配(0)),它只是对我们匹配的每个'y'执行'z'。

 类似资料:
  • 问题 你需要用另一个值替换字符串的一部分。 解决方案 使用 JavaScript 的 replace 方法。它与给定字符串匹配,并返回已编辑的字符串。 第一个版本需要 2 个参数:模式和字符串替换 "JavaScript is my favorite!".replace /Java/, "Coffee" # => 'CoffeeScript is my favorite!' "foo bar b

  • 本文向大家介绍替换Java字符串中的子字符串,包括了替换Java字符串中的子字符串的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的字符串。 我们想将子字符串“ Dead”替换为“ Alive”。为此,让我们使用以下逻辑。在这里,我们使用了while循环,并在其中找到了要替换的子字符串的索引。这样,我们一个接一个地替换了整个子字符串。 以下是替换子字符串的完整示例。 示例 输出结果

  • 问题内容: 我想替换列中的子字符串 到。 需求输出 我尝试,但它返回。 问题答案: 使用与更换和:

  • 假设我有一个字符串,如下所示: 我想把“abcd”换成“dddd”。我曾试图做这样的事: 它不起作用。有什么建议吗? 编辑:更具体地说,我在Java工作,我试图解析超文本标记语言文档,具体地说

  • 问题内容: 我正在用SQL创建一个临时过程,因为我有一个用markdown编写的表的值,因此该表在Web浏览器中显示为HTML (markdown到HTML转换) 。 该列的字符串当前如下所示: 我目前正在使用粗体和斜体文本。这意味着 (以粗体显示的情况下), 我需要更换奇N次的格局与乃至倍。 我看到了replace(),但是它在字符串的所有模式上执行替换。 那么,如何仅当它是奇数或偶数时才替换子

  • 问题内容: 我有一个以字符串形式传递的句子,我正在对单词“ and”进行替换,我想用“”替换它。而且它不是用空格替换“和”一词。以下是我的逻辑示例。而当我调试此逻辑时,逻辑确实落入了句子。 这里有我想念的东西吗? 问题答案: 而当我调试此逻辑时,逻辑确实落入了句子。 是的,然后你放弃返回值。 Java中的字符串是不可变的-当你调用时,它不会更改现有字符串的内容-它会返回经过修改的新字符串。所以你要