【问题标题】:Regex match any combination of two characters正则表达式匹配两个字符的任意组合
【发布时间】:2018-05-10 01:17:27
【问题描述】:

我正在尝试从字符串中删除多余的通配符,但遇到了一些麻烦。如果有?* 的任何组合,我想用* 替换它。例如我想简化

"*?a?s?*?k?i?n?a?r?d?*?*?d?e?d?i?c?a?t?e?d?*?r?e?g?i?o?n?a?l*"

"*a?s*k?i?n?a?r?d*d?e?d?i?c?a?t?e?d*r?e?g?i?o?n?a?l*"

在 Google 表格中,我正在使用 REGEXREPLACE 函数,并且可以在其中获得一部分。

=REGEXREPLACE(A1,"(\?\*)+","*")

"*?a?s*?k?i?n?a?r?d*?d?e?d?i?c?a?t?e?d*?r?e?g?i?o?n?a?l*"

但是,阅读其他线程似乎我必须以某种方式使用| 以允许*??*。但是当我尝试添加它时,所有? 都被删除了。

有什么建议吗?

【问题讨论】:

  • 您能告诉我们您尝试“添加”时使用的正则表达式吗?
  • 我尝试使用表达式(\?|\*)

标签: regex google-sheets wildcard


【解决方案1】:

试试这样:

=REGEXREPLACE(A1,"(\?\*|\*\?)+(\*|\?)?","*")

这里的关键部分是考虑不平衡的“对”,例如 ?*? 和可选的 ?。但我们不能忘记平衡对。

关于alternations 的一个重要部分是将它们从长到短排序以避免结果中出现双倍、三倍等* - 但这不适用于此处。


问题中没有提到,但是如果还允许多个符号,我们可以将这样的模式与通用正则表达式引擎一起使用:(?:\?\*|\*\?|(\*|\?)\1)+(\*|\?)?

但是,对于 Google 表格中的 REGEXREPLACE,这是不可能的。相反,我们可以链式替换这些情况。

【讨论】:

  • *替换所有?
  • 结果还有*? - "*a?s*?k?i?n?a?r?d*?d?e?d?i?c?a?t?e?d*?r?e?g?i?o?n?a?l*"。那是因为有?*?的实例...
  • 我认为您的意思是=REGEXREPLACE(A1,"(\?\*\??|\??\*\?)+","*"),因为现在括号中的两个选项不平衡。
  • @AntoineColson 谢谢。但是,第二种情况应该处理另一个不平衡的情况,*?*,幸运的是没有这样的情况。
  • 真的! OP 的示例中没有这种情况,但这只是一个示例;)所以我想最好的情况是:=REGEXREPLACE(A1,"(\?\*\??|\??\*\?)|\??\*\?|\?\*\??)+","*")
【解决方案2】:

=REGEXREPLACE(A1,"\?*\*[?*]*","*")

基本上,任何带有至少一个 * 的 ?s 和 *s 序列。

【讨论】:

  • 很好,但不适用于像这样的扩展情况*?a?s?*?k?i?n?a?r?d?*?*?d?e?d?i?c?a?t?e?d?*?****r?e?g????i?o?n?a?l*
  • 这个问题在其验证案例中有点稀疏,但我将其解释为用户想要删除多余的 Google 表格通配符以支持逻辑上等效的单个星号(“如果有任何组合? 或 *,我想用 *") 替换它。您可能有不同的解释,但为此我相信这种模式适用于您的情况:regex101.com/r/q3L4zV/1
  • 很遗憾,往往指导不是很清楚,案子已经了结。
【解决方案3】:
=REGEXREPLACE(A1,"[\?\*]{2,}","*")

任何组合:2 个或多个 {?,*} 将被 * 替换

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 2020-12-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多