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

3
我正在使用正则表达式搜索字符串。
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

Result should be

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

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

2
使用更好的模式替换regexp.replace? - user4039065
5个回答

4
您可以尝试以下方法:
^(\d+)[a-zA-Z]*(\s+.*)$

请将其替换为:

$1$2

Demo


1
因为提供了第一个可行的正则表达式解决方案,我给你点个赞。 - brettdj

4
您可以使用这个正则表达式:
(\d+)(\w{1})(\s.+)
  • (\d+) - 捕获一个或多个数字
  • (\w{1}) - 捕获要删除的一个字母 - 如果您有类似于123XX SOMEWHERE的示例,则要捕获XX,您将使用(\w+)(\w{1,2})如果您认为数字后面会有1或2个字符。
  • (\s.+) - 捕获空格后跟任何内容

当您想要替换时,只需删除第二个匹配组((\w{1}))并连接第一和第三个 - 因此在下面的Replace函数中使用$1$3

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


1
优雅!我只是不够熟练正则表达式。 - user4039065

1
如果您能在字符串开头找到<一些数字><单个字母><单个空格>,则将模式更改为<单个字母><单个空格>并用一个空格替换它。
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

1

只是为了提供一个非正则表达式的解决方案:

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

额外的信息总是很棒 - 谢谢 - 0m3r

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)))

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