正则表达式匹配两个字符的任意组合

Regex match any combination of two characters

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

"*?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*"

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

有什么建议吗?

这样试试:

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

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

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


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

但是,Google 表格中的 REGEXREPLACE 无法做到这一点。相反,我们可以链式替换这些案例。

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

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

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

任何 combinations:2 或更多的 {?,*} 将替换为 *