![有没有办法在 Excel 公式中使用正则表达式(或类似的解决方案)?](https://linux22.com/image/1425783/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%9C%A8%20Excel%20%E5%85%AC%E5%BC%8F%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%88%E6%88%96%E7%B1%BB%E4%BC%BC%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%89%EF%BC%9F.png)
我有一个电子表格,需要我进行一些匹配,也就是说,它是债券列表、它们的股票代码(名称)和一些有关它们的数据。我想匹配它们的股票代码(名称),我知道如何用正则表达式匹配它们(“[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 评估其值。
- 添加对“Microsoft VBScript 正则表达式 5.5”的引用
如何在 Microsoft Excel 单元格和循环中使用正则表达式 (Regex)
- 创建一个接受范围的函数,然后使用 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 有一些限制;)