regex - 如何删除重复的字符并仅在 Perl 中保留唯一的字符?

标签 regex perl string duplicates

如何删除重复的字符并仅保留唯一的字符。
例如,我的输入是:

EFUAHUU
UUUEUUUUH
UJUJHHACDEFUCU

预期输出为:
EFUAH
UEH
UJHACDEF

我遇到了 perl -pe's/$1//g while/(.).*\/'这很棒,但它甚至删除了输出中出现的单个字符。

最佳答案

这可以使用 positive lookahead 来完成:

perl -pe 's/(.)(?=.*?\1)//g' FILE_NAME

使用的正则表达式是:(.)(?=.*?\1)
  • . : 匹配任何字符。
  • 第一 () : 记住匹配的
    单个字符。
  • (?=...) : +ve 前瞻
  • .*? : 匹配之间的任何内容
  • \1 : 记得的比赛。
  • (.)(?=.*?\1) : 匹配并记住
    任何字符 仅当 它再次出现
    稍后在字符串中。
  • s/// : Perl 的做法
    代换。
  • g : 做替换
    全局......这就是不要停下来
    第一次替换。
  • s/(.)(?=.*?\1)//g : 这会
    从输入字符串中删除一个字符
    仅当该字符稍后再次出现时
    在字符串中。

  • 这将 不是 保持输入中字符的顺序,因为对于输入字符串中的每个唯一字符,我们保留其 最后 发生而不是 第一 .

    为了保持相对顺序不变,我们可以做 KennyTM在评论之一中说:
  • 反转输入线
  • 像以前一样做替换
  • 打印前反转结果

  • Perl 这一行是:
    perl -ne '$_=reverse;s/(.)(?=.*?\1)//g;print scalar reverse;' FILE_NAME
    

    既然我们在做 print反转后手动,我们不使用 -p标志但使用 -n旗帜。

    我不确定这是否是最好的单线。如果他们有更好的选择,我欢迎其他人编辑这个答案。

    关于regex - 如何删除重复的字符并仅在 Perl 中保留唯一的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582940/

    相关文章:

    arrays - Perl 如何访问作为数组元素的散列,该数组是另一个散列的值?

    perl - 从 perl 中的 Windows 程序读取数据时,打开时出现无效参数错误

    arrays - 如何在 perl 中以字节为单位获取数组的大小?

    c# - .Net 正则表达式货币

    regex - 我如何更好地理解 SmaCC 如何在正则表达式中使用 'isMethod' 功能?

    python - 如何在 Pandas 数据框中组合 AND 和 OR 运算符?

    Java 分割 CSV 忽略 HTML 字符

    python - python 的startswith 是如何工作的?

    c++ - 如何一次从字符串中删除一个字符?

    python - 返回包含文本值的列的列名