如何删除重复的字符并仅保留唯一的字符。
例如,我的输入是:
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/