替换所有非字母数字字符,包括通配符

Replace all non-alphanumeric characters, including wildcards

我从 JvdV 那里得到了这个漂亮的公式 :

=TRIM(CONCAT(IF(ISNUMBER(SEARCH(MID(A1,ROW(A:INDEX(A:A,LEN(A1))),1),"-./ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")),MID(A1,ROW(A:INDEX(A:A,LEN(A1))),1)," ")))

此公式将任何非字母数字字符 (&^%]#$) 替换为简单的 space " "。 我在公式中加入了一些例外 (-./ ),但这并不是所有的例外。 通配符怎么样?如何用这个公式过滤通配符(~*?)?

我想:好的,我将使用 FIND 而不是 SEARCH,一切都会正确,只需将小写和大写字母放在 FIND 索引中,如下所示:*"-./ 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"*

然后我想:但是,如果我不仅要保留数字和常规字母表怎么办?如果我想保留所有变音符号怎么办,像这样:"ÁÀȦÄǍĀÃÅĄȺẤẦẮẰǠǺǞẪẴẢȀȂẨẲẠḀẬẶĂÂḂɃƁḄḆĆĊĈČÇȻḈƇƆḊĎḐĐƊḌḒḎÐƉÉÈĖÊËĚĔĒẼĘȨɆẾỀḖḔỄḜẺȄȆỂẸḘḚỆÉÈÊËḞƑǴĠĜǦĞḠĢǤƓḢĤḦȞḨĦḤḪⱧÍÌİÏǏĬĪĨĮƗḮỈȈȊỊḬÍÌÏÎȷĴǰḰǨĶƘᶄḲḴⱩꝀꝂꝄĹĿĽⱢⱠĻȽŁḶḼḺḸꝈḾṀṂŃǸṄŇÑŅƝṆṊṈÑŊÓÒȮÔÖǑŎŌÕǪŐỐỒƟØṒṐṌȪỖṎǾȬǬỎȌȎƠỔỌỚỜỠỘỞỢÓÒÔÖÕØṔṖⱣƤƦŔṘŘŖɌⱤȐȒṚṞṜŚṠŜŠṤṦṢṨŞṪŤƬṬƮṰṮȾŢŦÚÙÛÜǓŬŪŨŮŲŰɄǗǛṸṺỦȔȖƯỤṲỨỪṶṴỮỬỰÚÙÛÜṼṾẂẀẆŴẄẈẊẌÝỲẎŶŸȲỸɎỶƳỴÝŹŻẐŽƵẒẔ"

然后小写和大写字母对于 FIND 索引来说太多了。

好的,SEARCH 索引也太多了,因为函数接受最大值。 255 长度,但假设我们在索引中只有 200 个字符(数字、字母和一些变音符号)

所以,问题可用:

这种公式如何过滤(替换为space)通配符(~*?)?

当我阅读这个问题时,有几个问题:

  • 如何在 SEARCH() 的第二个参数中包含超过 255 个字符;
  • 如何在 SEARCH() 的第二个参数中排除文字通配符;

绕过长度限制的一种方法是向 SEARCH() 提供一个选项数组,在本例中为长度 <255:

的两个元素的数组

C1中的公式:

=TRIM(CONCAT(IF(MMULT(IFERROR(SEARCH("~"&MID(A1,ROW(A:INDEX(A:A,LEN(A1))),1),{"ÁÀȦÄǍĀÃÅĄȺẤẦẮẰǠǺǞẪẴẢȀȂẨẲẠḀẬẶĂÂḂɃƁḄḆĆĊĈČÇȻḈƇƆḊĎḐĐƊḌḒḎÐƉÉÈĖÊËĚĔĒẼĘȨɆẾỀḖḔỄḜẺȄȆỂẸḘḚỆÉÈÊËḞƑǴĠĜǦĞḠĢǤƓḢĤḦȞḨĦḤḪⱧÍÌİÏǏĬĪĨĮƗḮỈȈȊỊḬÍÌÏÎȷĴǰḰǨĶƘᶄḲḴⱩꝀꝂꝄĹĿĽⱢⱠĻȽŁḶḼḺḸꝈḾṀṂŃǸṄŇÑŅƝṆṊṈÑŊÓÒȮÔÖǑŎŌÕǪŐỐỒƟØṒṐṌȪỖṎǾȬǬỎȌȎƠỔỌỚỜỠỘỞỢÓÒÔÖÕØṔṖⱣƤƦŔṘŘŖɌⱤ";"ȐȒṚṞṜŚṠŜŠṤṦṢṨŞṪŤƬṬƮṰṮȾŢŦÚÙÛÜǓŬŪŨŮŲŰɄǗǛṸṺỦȔȖƯỤṲỨỪṶṴỮỬỰÚÙÛÜṼṾẂẀẆŴẄẈẊẌÝỲẎŶŸȲỸɎỶƳỴÝŹŻẐŽƵẒẔ-./*? 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"}),0),{1,1}),MID(A1,ROW(A:INDEX(A:A,LEN(A1))),1)," ")))

我们在这里做的是:

  • 使用水平排列 {abc;xyz} 来检查我们的字符是垂直排列 {a,b,c}。注意 semi-column 和逗号之间的区别。
  • 结果将是一个 MMULT() 可以求和的二维数组。这意味着如果在数组的两个元素中的任何一个中找到该字符,它将 return 相同的字符。否则,space.
  • 特殊通配符现在也包含在额外的波浪号中以转义它们,实际上所有字符都是如此。
  • 如果 Excel 不能将所有小写变音符号识别为大写变音符号,只需将它们添加到两个元素之一即可。如果需要,请添加第 3 个。但是要知道你也需要扩展 MMULT() 中的第二个参数。

可视化以上内容:

请记住,您使用的是 Excel 2019,这意味着您需要 CSE-enter 这个公式。不用说,在 ms365 中使用其动态数组功能,一切都会变得容易得多。