有没有办法在 Excel 公式中使用正则表达式(或类似的解决方案)?

有没有办法在 Excel 公式中使用正则表达式(或类似的解决方案)?

我有一个电子表格,需要我进行一些匹配,也就是说,它是债券列表、它们的股票代码(名称)和一些有关它们的数据。我想匹配它们的股票代码(名称),我知道如何用正则表达式匹配它们(“[AZ]+ \d{2,4}-\w+ \w+”),但我不熟悉如何在 VBA 之外使用它们(是的,我更喜欢不使用 VBA,使用这个的人不知道 VBA)。

我读过这篇文章微软,所以我知道这个问题(问题中的陈述而不是答案)是不正确的,但我从来没有真正找到如何在 Excel 中实现正则表达式,尤其是公式(也许只是MATCH也许)。

最后举个例子(只是相关的列),为了使我的问题更加具体,我想返回单元格行代码为:

JPMCC 2012-1 A1 

Prepay %
Loss %
Credit Support
ETC...

MLMTI 2014-6 B4

Prepay %
Loss %
Credit Support
ETC...

要返回的行:

JPMCC 2012-1 A1 
MLMTI 2014-6 B4

请注意,此列中有很多这样的债券,我需要逐一查找

此外,如果您发现使用辅助列在这里很有用,我愿意接受,但现在我只是想避免使用 VBA。

如果需要的话我会提供更多信息。

谢谢

更新

数据,在本例中包括“信用支持”、“累计损失百分比”、“预付款百分比”等标题,有几十个这样的标题,但都是文本,数字位于不同的列中。

答案1

Excel 没有正则表达式,但你当然可以一次用一个公式来实现它们的大部分功能。以下是一些示例:

提取第一个以空格分隔的单词:

B1: =FIND(" ", A1)
C1: =LEFT(A1, B1 - 1)

检查第一个单词是否全部非小写:

D1: =EXACT(UPPER(C1), C1)

提取第二个空格分隔的单词:

E1: =FIND(" ", A1, B1 + 1)
F1: =MID(A1, B1 + 1, E1 - B1 - 1)

如果可能的话,提取 4 位数字的年份:

G1: =LEFT(F1, 4) - 0

您可以根据需要创建任意数量的提取和测试,以确信 A1 中的数据与股票代码格式匹配,而不是标题格式,然后使用如下方法仅在正确的情况下重现该单元格:

H1: IFERROR(IF((B1+E1+LEN(C1)+LEN(F1)+G1+D1)*0=1,"",A1),"")

显示辅助列的电子表格

答案2

接受的答案很好。我要补充一点,具体到 RegEx,你可以将一个范围传递给 VBA 函数,然后使用 RegEx 评估其值。

  1. 添加对“Microsoft VBScript 正则表达式 5.5”的引用

如何在 Microsoft Excel 单元格和循环中使用正则表达式 (Regex)

  1. 创建一个接受范围的函数,然后使用 RegEx 对其进行评估。

从 Excel 公式调用函数——用户不必了解 VBA,只需知道函数的名称。

只要函数采用范围而不是字符串,Excel 中的输出就会实时更新。(Excel 会知道范围何时被修改,而如果它只是从单元格传递的字符串,它就不会知道。)

或者您也可以创建一个按钮或类似的东西来调用 VBA 并进行过滤。这将满足用户不需要了解 VBA 的要求。

答案3

我会尝试高级筛选 - 您可以用通配符设置条件表,然后将筛选操作指向它。您可以在数据功能区的“排序和筛选”部分(在 Excel 2013 中)找到“高级”按钮。

这里有一个非常详细的演练:

高级过滤器:Excel 的惊人正则表达式替代品

答案4

如果您想要查找两个数字或者两个模式,那么请使用此公式执行相同操作。

=or(isnumber(find("1519",b3)), isnumber(find("1521",b3)))

在此示例中,“1519”和“1521”是模式,您也可以更改这些模式,例如,

=or(isnumber(find("foo",b3)), isnumber(find("bar",b3)))

你可以添加任意数量的图案,但 Excel 有一些限制;)

相关内容