【发布时间】:2018-08-19 06:55:09
【问题描述】:
我可以看到很多关于这个主题的帖子,但没有一个专门解决我遇到的问题。
我有一个包含文本和数字的字符串。当它第一次看到一个数字时,我需要将字符串分成 2 列。
示例:
Ballyvic Boru5/6
First Drift2/1
Sizing Cusimanoin15/2
变成:
【问题讨论】:
-
使用正则表达式regex101.com/r/aY3hZ1/1
我可以看到很多关于这个主题的帖子,但没有一个专门解决我遇到的问题。
我有一个包含文本和数字的字符串。当它第一次看到一个数字时,我需要将字符串分成 2 列。
示例:
Ballyvic Boru5/6
First Drift2/1
Sizing Cusimanoin15/2
变成:
【问题讨论】:
这是您可以在工作表上使用的一对函数(而不是必须运行 VBA 程序来“修复”一次单元格):
Public Function splitNum1(str As String) As String
Dim p
For p = 1 To Len(str)
If Mid(str, p, 1) Like "#" Then Exit For
Next
splitNum1 = Left(str, p - 1)
End Function
Public Function splitNum2(str As String) As String
splitNum2 = Right(str, Len(str) - Len(splitNum1(str)))
End Function
splitNum1 返回数字“左侧”的字符串。
splitNum2 返回以第一个数字开头的字符串。
【讨论】:
这是一个正则表达式方法:
您必须设置对
Microsoft VBScript Regular Expressions x.x的引用,其中 x.x 是您拥有的最高版本(我的是 5.5)
Option Explicit
Sub splitCells()
Dim RegEx As New RegExp, i As Long, tempStr As String
With RegEx
.Global = True
.IgnoreCase = True
.Pattern = "(([a-z]*\s?)*\D)(\d.*)"
End With
With ThisWorkbook.Worksheets(1)
For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
If RegEx.Test(.Cells(i, 1)) Then
tempStr = .Cells(i, 1)
.Cells(i, 1) = RegEx.Replace(tempStr, "$1")
.Cells(i, 2) = RegEx.Replace(tempStr, "$3")
End If
Next i
End With
End Sub
(([a-z]*\s?)*\D)(\d.*)
[a-z]* 匹配字母表中的任何字符,* 乘数可无限次出现
\s? 匹配任何空格字符,使用 ? 乘数匹配 0-1 次出现(意味着可能有也可能没有空格
以上两个都包含在一个分组 () 中,后跟另一个 * 以匹配 0 次无限次出现
\D 这不包括所有数字
上面包含在一个组中,第一个(([..])*\D)
我们有最后一组:(\d.*),它匹配第一个数字和后面的所有内容。
【讨论】: