在Microsoft Excel中进行正则表达式子字符串替换

7

我希望能够批量替换一列字符串(移动电话号码)中的“07”部分为国际版本的“447”。

这些字符串目前在Excel电子表格中形成一列。

我已经有了匹配需要修改的字符串的正则表达式:

^07[0-9]{9}$

...但我不知道如何进行所需的替换。

数据在Excel电子表格中,但当然可以导出。

首选解决方案是保留数据在Microsoft Excel中,但它当然可以被导出并重新导入。我知道TextMate有一个正则表达式替换功能。这能帮助我吗?

3个回答

16

我本来要去寻找优雅的VBA解决方案或其他东西,然后我想:“等等。我们只想操作一些我们拥有的电子表格中的数据。为什么要把事情搞复杂呢?”

这个想法对您听起来如何:

  • 在现有数据所在的列(假设是C列)后面插入一个新列

  • 用这个公式填充新列:="447" & RIGHT(C1, 9)

  • 选择新值所在的D列,使用“粘贴值”(在“粘贴特殊”对话框中)替换现有值所在的C列

  • 删除“临时”列D

这不是编程,但如果您只需要执行一次,您并不需要编写程序,对吗?


6
根据问题描述,似乎不是所有的电话号码都需要转换(即它们并非全部以"07"开头)。只需在上述公式中加入IF函数来处理:=IF(LEFT(C1,2)="07","447"&RIGHT(C1,9),C1),这样可以解决该问题。请注意,翻译时不改变原文意思、不添加解释,并尽量保持通俗易懂。 - barrowc

11

使用Excel VBA。引用“Microsoft VBScript正则表达式5.5”。

然后,在新的常规VBA模块中执行以下操作:

Sub ReplaceMobileNumbers
  Dim re as New RegExp

  re.Pattern = "^0(?=7[0-9]{9}$)"   ''# look-ahead

  Dim cell As Range
  For Each cell In ActiveSheet.Range("Your Range Address in A1:B1 notation")
   cell.Value = re.Replace(cell.value, "44")
  Next cell
End Sub

在即时窗口中调用此子程序。上面的代码是一次性代码,没有考虑可重用性。我知道这点,所以不要告诉我。;-)

虽然您可能可以使用单元格函数:

=IF(AND(LEN(A1) = 11;LEFT(A1; 2) = "07"); "44" & RIGHT(A1; 10); A1)

+1 更完整实用 - Cheers and hth. - Alf

9

您需要在工作表中包含Microsoft Regular Expressions(将其添加为引用)。

然后,制作一个快速宏,如下所示,以使用它:

Dim reg As New RegExp
Public Function RegMatch(Source As Range, Pattern As String, Optional IgnoreCase As Boolean = True, Optional MultiLine As Boolean = True) As Long
    Dim rng As Range, i As Long, j As Long

    reg.IgnoreCase = IgnoreCase
    reg.MultiLine = MultiLine
    reg.Pattern = Pattern

    i = 0: j = 0
    For Each rng In Source
        i = i + 1
        If reg.test(rng.Value) Then
            j = i
            Exit For
        End If
    Next
    RegMatch = j
End Function

然后,在您的表格中调用它作为宏(例如):
=INDEX(B6:B15, RegMatch($A$6:$A$15, $A$3))

第一个参数为您的范围,第二个参数为您的模式(如上所述)


不错的提示,该库的完整名称是Microsoft VBScript正则表达式5.5 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接