从字符串

时间:2017-04-27 22:30:48

标签: regex vba

我正在尝试解析一些信息(使用 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”。和数字/字母组,即183E298ER20等。

我能够与以下功能非常接近:

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 EMaersk Bulan YH

我想我的问题是:有没有办法看看那个带数字的群体中是否有字母?如果是这样,只需删除该组?

我确定有一个正则表达式模式,但我仍在学习正则表达式,所以没想出来,但很想找到一个。

如果还有其他选择,我也会对此持开放态度。当然,我可以遍历单元格中的每个字符,并注意当一个数字出现在一个字母旁边,然后开始跟踪直到下一个空格,然后删除该组,但这似乎效率很低。

感谢您的任何想法,如果我能澄清任何事情,请告诉我!

PS:我不能只是“剪切”最后一组文字。有时候我有一个我想要保留三个名字的单元格(Seago Bremerhaven One),有时我只有两个部分Maersk ShipSeago AntwerpSeago 29E2R

1 个答案:

答案 0 :(得分:2)

在字符串的开头使用锚^,您可以提取名称。

正则表达式: ^(?:[A-Za-z]+\s)*多行选项开启

<强>解释

^将在行首开始匹配。 (?:[A-Za-z]+\s)*将查找字符组合(假设名称中没有数字),后跟空格。自使用*量词后,此模式将多次搜索。因此,在一行中匹配多个名称。

<强> Regex101 Demo