从字符串中的第一个单词中删除最后一个字符

时间:2017-03-23 04:26:49

标签: regex excel vba excel-vba

我使用RegEx搜索字符串

If RegExp.test(Cel.Value) Then
    Debug.Print Left$(Cel.Value, Len(Cel.Value) - 1)
End If

这是我的数据

3250A WEST SEM
110055K KEALY RD
804B WEST AMERICA
804 EAST AMERICA

结果应为

3250 WEST SEM
110055 KEALY RD
804 WEST AMERICA
804 EAST AMERICA

删除最后一个字符的最佳方法是什么?

5 个答案:

答案 0 :(得分:4)

你可以试试这个:

^(\d+)[a-zA-Z]*(\s+.*)$

并替换为:

$1$2

Demo

答案 1 :(得分:4)

您可以使用此正则表达式:

(\d+)(\w{1})(\s.+)
  • (\d+) - 捕获一个或多个数字
  • (\w{1}) - 捕获您要移除的一个字母 - 如果您有示例123XX SOMEWHERE然后捕获XX,如果您认为将有1,则使用(\w+)(\w{1,2})或数字后面的2个字符。
  • (\s.+) - 捕获一个空格,后跟任何内容

如果您想要替换,只想删除第二个匹配组((\w{1}))并加入第一个和第三个匹配组 - 因此$1$3函数中的Replace

strReplaced = objRegex.Replace(CStr(varTest), "$1$3")

示例VBA代码

Option Explicit

Sub Test()

    Dim objRegex As Object
    Dim varTests As Variant
    Dim varTest As Variant
    Dim strPattern As String
    Dim strReplaced As String

    varTests = Array("3250A WEST SEM", "110055K KEALY RD", "804B WEST AMERICA")
    strPattern = "(\d+)(\w{1})(\s.+)"

    Set objRegex = CreateObject("VBScript.Regexp")
    objRegex.Pattern = strPattern

    For Each varTest In varTests
        strReplaced = objRegex.Replace(CStr(varTest), "$1$3")
        MsgBox strReplaced
    Next varTest

End Sub

正则表达式的花式图:

enter image description here

答案 2 :(得分:1)

RegEx场景 - 如果您可以在字符串的开头处找到<某些数字><单个字母><单个空格> ,那么请更改模式到<单个字母><单个空格> 并用一个空格替换它。

Option Explicit

Sub stripAlphaSuffix()
    Dim i As Long, regex As Object

    Set regex = CreateObject("VBScript.RegExp")

    With Worksheets("Sheet1")
        For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            With regex
                .Global = False
                .MultiLine = False
                .IgnoreCase = False
                .Pattern = "^[0-9A-Z ]{3,8}"
            End With
            If regex.Test(.Cells(i, "A").Value2) Then
                regex.Pattern = "[A-Z ]{2}"
                .Cells(i, "A") = regex.Replace(.Cells(i, "A").Value2, Chr(32))
            End If
        Next i
    End With
End Sub

答案 3 :(得分:1)

只是投入一个非RegEx解决方案:

Dim cel As Range
Dim word As String

For Each cel In Range("A1", Cells(Rows.Count, 1).End(xlUp))
    word = Split(cel, " ")(0)
    cel.Value = Replace(cel.Value, word, Left(word, Len(word) - 1))
Next

答案 4 :(得分:1)

由于VAL从字母数字字符串中删除非数字,然后你可以尝试这个(它不会假定总有一个字符需要替换)

  

VAL("3250A") = 3250

如果它不需要附加其余的字符串,那会更优雅:)

Dim StrIn As String
Dim X
StrIn = "3250A WEST SEM"
X = Split(StrIn, Chr(32))
MsgBox Val(StrIn) & Right$(StrIn, Len(StrIn) - Len(X(0)))