【问题标题】:Regular Expressions in Notepad++ Remove duplicate letters from a wordNotepad ++中的正则表达式从单词中删除重复的字母
【发布时间】:2016-05-26 03:03:30
【问题描述】:

在记事本++中,我想以下列方式查找和替换。

如果一个词是“书” 这是这个词中的两个“o”。我想删除一个'o'

处理后的单词将是“Bok”

这里有一些例子

UFU>UF

sans > san

菜鸟>菜鸟

时钟>时钟

AABBCC > ABC

或者我可以一个字母一个字母地删除重复的单词。让我们先删除所有重复的 'a' 然后重复 'b' 然后......直到 'z'

喜欢-

ABCDEEABCDDABB > ABCDEEBCDDBB > ABCDEECDD > ABCDEEDD > ABCDEE > ABCDE

Antidisestablishmentarianism > Antidisestblishmentrinism > Antidisestblishmntrinism > Antidsestblshmntrnsm > Antidsestblshmntrns > Antidsestblshmtrs > Antidsetblhmtr > Antidseblhmr

【问题讨论】:

  • 香蕉的输出是什么?
  • 香蕉将被禁止。否则我可以一个一个地删除重复的单词。就像首先删除所有重复的'a'然后重复'b'......
  • 还有哈密瓜!?
  • 如果你想处理 'cantaloupe' 那么它将是 cantaloupe>cantloupe
  • 我怀疑正则表达式是否是解决此类问题的正确方法。

标签: regex notepad++ pcre


【解决方案1】:

如果您想一次性完成所有操作,那么没有办法,仅靠正则表达式是不行的。但是,您可以使用一个正则表达式进行多次传递:

((.)(?:(?!\2).)*)\2+

替换为$1 并继续这样做,直到文本停止更改。

这会查找具有一个或多个重复项的第一个字符,并捕获它以及组#1 中没有重复项的任何后续字符。用组 #1 替换整个匹配项可以有效地删除重复字符(或多个字符,如果 \2+ 消耗多个字符)。

如果您正在处理包含多个单词的文本,并且想要全部更改,您可以使用\S\w 而不是.,以忽略空格和/或标点符号。

【讨论】:

    【解决方案2】:

    这工作(\S*)([a-z])(\S*)(\2)(\S*)
    替换为\1\2\3\5
    您需要进行迭代,直到消耗完所有重复项。

    说明
    有五个捕获组,每个组在每个括号对上。其中三个是(\S*),这意味着“没有空格”以保持单词边界的表达。 ([a-z]) 匹配一个字符,(\2) 匹配同一个字符。此捕获组(\2) 是第 4 个,并且是重建表达式之外的唯一组,将重复的字符排除在外。

    【讨论】:

    • 工作顺利。谢谢。我了解查找正则表达式,但我不了解替换正则表达式
    • 替换文本不是正则表达式,它只是“一个表达式”,其中转义数字指的是捕获组,并且可以存在文字。 (在这种情况下没有)。除了反斜杠,这里没有任何符号有特殊含义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多