【问题标题】:Finding unique characters in words with RegEx使用 RegEx 查找单词中的唯一字符
【发布时间】:2021-09-03 11:25:49
【问题描述】:

我想使用 RegEx 匹配仅在该单词中出现一次的序列中的字符。因此,例如在armored armadillo 中,唯一的匹配项是ei

我的第一次尝试是使用环视来匹配字符,这样在匹配之前或之后不会出现相同字符的副本:

(.)(?<!^.*\1)(?!\1.*$)

但无论我做什么,这似乎都不匹配任何字符。我究竟做错了什么?如何以我想要的方式匹配字符?

【问题讨论】:

  • 我认为正则表达式是解决这个问题的错误工具。
  • 也许吧,但这里的目标主要是说教 - 我正在努力学习 RegEx,所以我强迫自己用它来解决问题,即使我已经知道如何以其他方式解决它们
  • 您可能想在将来提出这一点,因为该网站专注于实用 解决方案,而不是说教解决方案。 (如in big print the tour 所说:“获取实用、详细问题的答案。)

标签: regex regex-lookarounds


【解决方案1】:

你可以使用

(.)(?<!\1.+)(?!.*\1)

正则表达式将一个字符捕获到第 1 组,然后通过两个环视确保前后没有这样的字符。

要匹配包括换行符在内的任何字符,请将 . 替换为 [\s\S] 或在模式前添加 (?s) 内联修饰符(在 Ruby 中为 (?m))。

详情

  • (.) - 第 1 组:任何单个字符(默认情况下换行符除外)
  • (?&lt;!\1.+) - 如果有第 1 组值后跟一个或多个字符而不是换行符字符,则匹配失败的否定后向查找在当前位置的左侧尽可能多(此处需要+ 以确保. 匹配至少一个字符,即被捕获到组 1 中的字符)
  • (?!.*\1) - 如果存在零个或多个除换行符之外的字符,则匹配失败的负前瞻,然后将第 1 组值立即放在当前位置的右侧。

the regex demo

【讨论】:

  • 有趣。为什么在负面后视中需要+?是不是它不会通过将引用与自身进行比较来注册否定?
  • @TheRedMage 我添加了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2017-09-10
  • 2021-02-16
相关资源
最近更新 更多