【问题标题】:Remove duplicated characters using regex使用正则表达式删除重复字符
【发布时间】:2020-07-10 08:47:58
【问题描述】:

当一些字符被重复时,你将如何删除正则表达式中的重复字符?

例如,我有“BBAALLLLOOOONN”,我希望输出只是 BALLOON。

我已经尝试过这个正则表达式:/(.)(?=\1)/g,但结果会是“BALON”而不是“BALLOON”。

【问题讨论】:

  • 唯一的办法就是拥有一本英文词典。还是所有的词总是重复?因为如果是这样的话,忘记正则表达式。 A="BBAALLLLOOOONN"; A(1:2:end)
  • 嗨。我从标点符号和数字读取的 .txt 文件中重复所有字符(不是单词)。

标签: regex matlab parsing string-parsing


【解决方案1】:

使用

regexprep(line, '([A-Za-z])\1', '$1')

proof

() 是使用\1 引用的捕获组,\1 使用重复的字符,并且每个匹配项仅返回捕获的字母,因为替换模式是 $1 反向引用。

【讨论】:

  • 有道理。谢谢!
【解决方案2】:

不要使用前瞻。将 (.)\1 替换为 \1。

在 ruby​​ 中是 "BBAALLLLOOOONN".gsub(/(.)\1/, '\1')

【讨论】:

  • 问题是关于 MATLAB
  • 好的,但这是关于正则表达式的,让 ruby​​ 示例适应任何内容都不会太难。
  • 确实如此,但不同的语言支持不同的正则表达式功能
  • 谢谢。正是我需要的。如果有人好奇,这是 Matlab 中的等效逻辑: regexprep(line, format, '$1') 其中 line 是具有重复字符的一行字符,例如 BBAALLLLOOOONN!!,format 是正则表达式,即 '(.)\1 ' 和 '$1' 等同于 '\1'
  • 嘿嘿,前瞻不会“消耗”它的含义。因此,在您的版本中,您匹配了任何字符,然后是相同的字符,但第二个不在匹配中。如果后面跟着相同的字符,则下一个全局匹配会再次命中第二个字符。此版本使用第二个字符,因此下一个全局匹配在第二个字符之后开始。
猜你喜欢
  • 2011-06-02
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多