我已经编写了一个代码,该代码在文本和数字之间插入一个空格,将“无空格”的日期和月份与日期分开,并且可以按预期工作。
唯一的问题是我正在使用If then
结构来确定应使用哪个正则表达式pattern
。
如果日期的第一个字符是数字,然后知道它是'DayMonth
'序列,那么我将使用以下模式:"(.*\d)(?! )(\D.*)"
。否则,假设它不在'DayMonth'
序列中,而是在'MonthDay
'序列中,我使用另一种模式:"(.*\D)(?! )(\d.*)"
。
是否可以同时使用两种模式来扫描正则表达式对象,以便摆脱If Then
结构?
我的下面的代码:
Sub SpaceMonthDayIf()
Dim col As Range
Dim i As Long
Set col = Application.InputBox("Select Date Column", "Obtain Object Range", Type:=8)
With CreateObject("VBScript.RegExp")
For i = 1 To Cells(Rows.Count, col.Column).End(xlUp).Row
If IsNumeric(Left(Cells(i, col.Column).Value, 1)) Then
.Pattern = "(.*\d)(?! )(\D.*)"
Cells(i, col.Column) = .Replace(Cells(i, col.Column), "$1 $2")
Else
.Pattern = "(.*\D)(?! )(\d.*)"
Cells(i, col.Column) = .Replace(Cells(i, col.Column), "$1 $2")
End If
Next
End With
End Sub
为清楚起见,这是我运行代码时发生的情况:
答案 0 :(得分:1)
尝试此代码
def foo(arg1):
if isinstance(arg1, str):
print("It's a string!")
else:
print("It's not a string!")
答案 1 :(得分:0)
您可以通过不同地插入空格来避免这种情况。这是一个Function
,带有早期绑定,但是您可以将其更改为后期绑定。
匹配字母和数字之间的交点,然后构造一个字符串,并在其中适当插入一个空格。
Option Explicit
Function InsertSpace(S As String) As String
Const sPat As String = "[a-z]\d|\d[a-z]"
Dim RE As RegExp, MC As MatchCollection
Set RE = New RegExp
With RE
.Global = False
.Pattern = sPat
.IgnoreCase = True
If .Test(S) = True Then
Set MC = .Execute(S)
With MC(0)
InsertSpace = Left(S, .FirstIndex + 1) & " " & Mid(S, .FirstIndex + 2)
End With
End If
End With
End Function
您也可以在不使用正则表达式的情况下完成此操作:
编辑 Like
运算符的模式更改
Option Explicit
Option Compare Text
Function InsertSpace2(S As String) As String
Dim I As Long
For I = 1 To Len(S)
If Mid(S, I, 2) Like "#[a-z]" Or Mid(S, I, 2) Like "[a-z]#" Then
InsertSpace2 = Left(S, I) & " " & Mid(S, I + 1)
Exit Function
End If
Next I
End Function