我正在尝试解析一些信息(使用 VBA ,在Excel中),删除数字和“关联的字母”。不幸的是,就编程而言,我无法想到一个简单的模式。但是,“看着它”,我可以看到我想要删除数据的位置。
这是一个信息的模拟列表(每行是一个单元格):
Maersk Bentonville voy. 1283
CRC Brooklyn 183E
Piraeus 298ER20
Seago Istanbul - voy. 182
Maersk Bulan YH828
Buton 164NN
Seago Bremerhaven One
Seago Antwerp 149E
Captain Maersk NY8821
Carsten Maersk OC9192
Cecilie Vessel 12N3R
Charlotte Maersk 1290
期望的输出:
Maersk Bentonville
CRC Brooklyn
Piraeus
Seago Istanbul
Maersk Bulan
Buton
Seago Bremerhaven One
Seago Antwerp
Captain Maersk
Carsten Maersk
Cecilie Vessel
Charlotte Maersk
我只想获得名称(即Maersk Bentonville
)。我没有可以比较的主列表,所以我只想删除“voy”。和数字/字母组,即183E
,298ER20
等。
我能够与以下功能非常接近:
Function RemoveNumbers(Txt As String) As String
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "[0-9]|[-+./]+|(voy)"
RemoveNumbers = .Replace(Txt, "")
End With
End Function
但是你会注意到Maersk Brooklyn E
,Maersk Bulan YH
。
我想我的问题是:有没有办法看看那个带数字的群体中是否有字母?如果是这样,只需删除该组?
我确定有一个正则表达式模式,但我仍在学习正则表达式,所以没想出来,但很想找到一个。
如果还有其他选择,我也会对此持开放态度。当然,我可以遍历单元格中的每个字符,并注意当一个数字出现在一个字母旁边,然后开始跟踪直到下一个空格,然后删除该组,但这似乎效率很低。
感谢您的任何想法,如果我能澄清任何事情,请告诉我!
PS:我不能只是“剪切”最后一组文字。有时候我有一个我想要保留三个名字的单元格(Seago Bremerhaven One
),有时我只有两个部分Maersk Ship
,Seago Antwerp
或Seago 29E2R
。
答案 0 :(得分:2)
在字符串的开头使用锚^
,您可以提取名称。
正则表达式: ^(?:[A-Za-z]+\s)*
多行选项开启
<强>解释强>
^
将在行首开始匹配。
(?:[A-Za-z]+\s)*
将查找字符组合(假设名称中没有数字),后跟空格。自使用*
量词后,此模式将多次搜索。因此,在一行中匹配多个名称。
<强> Regex101 Demo 强>