有没有办法在空格前组合两个字符


Function RandChars(n As Long, Optional alphabet As String = "abcdefghijklmnopqrstuvwxyz0123456789") As String
Dim chars() As String
Dim i As Long, k As Long
k = Len(alphabet)
ReDim chars(1 To n)
With Application.WorksheetFunction
For i = 1 To n
chars(i) = Mid(alphabet, .RandBetween(1, k), 1)

Next i
End With
RandChars = Join(chars, " ")
End Function

该代码例如显示为:;6 z l t v c p z a s 8 f">

有没有任何方法可以调整代码,使其显示:";6z lt vc pz为8f";?

您可以将您的线路加倍:

chars(i) = Mid(alphabet, .RandBetween(1, k), 1)

chars(i) = Mid(alphabet, .RandBetween(1, k), 1) & Mid(alphabet, .RandBetween(1, k), 1)

根据我的评论,我想我可能会尽量避免重复第二个值的字母/数字。例如,为了避免得到";55 rr"等等。所以这也是我得到的:

Function RandChars(n As Long, Optional alphabet As String = "abcdefghijklmnopqrstuvwxyz0123456789") As String
Dim chars() As String
Dim chars2 As String
Dim i As Long, k As Long
k = Len(alphabet)
ReDim chars(1 To n)
With Application.WorksheetFunction
For i = 1 To n
chars(i) = Mid(alphabet, .RandBetween(1, k), 1)
FindChars2:
chars2 = Mid(alphabet, .RandBetween(1, k), 1)
If chars(i) = chars2 Then
GoTo FindChars2
Else
chars(i) = chars(i) & chars2
End If
Next i
End With
RandChars = Join(chars, " ")
End Function

我使用了正则表达式,还向函数调用添加了一个可选参数,使您能够决定;组的大小。

例如:

Function RandChars(n As Long, Optional group As Long = 2, Optional alphabet As String = "abcdefghijklmnopqrstuvwxyz0123456789") As String
Dim chars() As String
Dim i As Long, k As Long
k = Len(alphabet)
ReDim chars(1 To n)
With Application.WorksheetFunction
For i = 1 To n
chars(i) = Mid(alphabet, .RandBetween(1, k), 1)
Next i
End With
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "(.{" & group & "})(?=.)"
.Global = True
RandChars = .Replace(Join(chars, ""), "$1 ")
End With
End Function

例如:

randchars(12) --> xk pj hr k5 i8 7d 
randchars(12,3) --> qg3 54s sec myu 

Regex的解释

分组字符

(解释适用于两个字符,但适用于任何n(

(.{2})(?=.)
  • 匹配下面的正则表达式,并将其匹配捕获到后引用编号1(.{2})
    • 匹配任何不是换行字符.{2}的单个字符
      • 正好是{2}的2倍
  • 断言下面的正则表达式可以从这个位置开始匹配(正向前瞻((?=.)
    • 匹配任何不是换行字符.的单个字符

替换字符串

$1·

  • 插入通过捕获组号1$1最后匹配的文本
  • 按字面插入字符">

使用RegexBuddy 创建

除了@Simon的代码之外,还有一个较短的版本:

Function RandChars(n As Long, Optional alphabet As String = "abcdefghijklmnopqrstuvwxyz0123456789") As String
Dim k As Long: k = Len(alphabet)
Dim chars() As String: ReDim chars(1 To n)
With Application.WorksheetFunction
Dim i As Long
For i = 1 To n
chars(i) = Mid(alphabet, .RandBetween(1, k), 1) & String((i - 1) Mod 2, " ")
Next i
End With
'return function result
RandChars = Trim(Join(chars, ""))
End Function

直接创建所需的字符串可能是最简单的解决方案。

Function RandChars(n As Long, _
Optional Alphabet As String = "abcdefghijklmnopqrstuvwxyz0123456789") _
As String

Dim Fun     As String
Dim Chars() As String
Dim i       As Long
Dim k       As Long

k = Len(Alphabet)
ReDim Chars(1 To n)
For i = 1 To n
Fun = Fun & Mid(Alphabet, WorksheetFunction.RandBetween(1, k), 1)
If i Mod 2 = 0 Then Fun = Fun & " "
Next i

RandChars = Trim(Fun)
End Function

最新更新