将带有正则表达式的值转换为实际值
Convert a value with a regex to a real value
我有一个巨大的文件,其中包含带有正则表达式的值,如下所示:
LGP0041_\d{4}\.dta
objd135a_\S{3}.txt
现在我需要将它们转换为有效的示例值,如下所示:
LGP0041_1234.dta
objd135a_abc.txt
我知道 RegExp
对象可以检查是否存在匹配项,但是否还有创建有效值的方法?
可以使用正则语法来识别或生成其语言的单词,但VBScript正则表达式引擎不实现生成。所以你必须自己动手。
您的示例不包含常规模式。 \S
不能表示 'non-whitespace',因为您不会喜欢文件名中的非法字符,并且典型的文件名示例应该包含带空格的元素。第一个示例转义了扩展点而第二个示例并没有让我认为您的语法规范没有经过深思熟虑。如果您提出了输入的(常规)语法,我愿意进一步考虑您的问题。
思考的一些代码:
Option Explicit
Function rndInt(lowerbound, upperbound)
rndInt = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
End Function
Sub shuffleAD(aX)
' Durstenfeld's Permutation Algorithm
Dim J, K, Temp
For J = UBound(aX) To 1 Step -1
K = Int((J + 1) * Rnd) ' random number 0 - J
Temp = aX(J)
aX(J) = aX(K)
aX(K) = Temp
Next
End Sub ' shuffleAD
Class cRGen
Private m_
Public Function init(s)
Set init = Me
ReDim m_(Len(s) - 1)
Dim i
For i = 0 To UBound(m_)
m_(i) = Mid(s, i + 1, 1)
Next
End Function
Public Function getNext(mi, ma)
shuffleAD m_
getNext = Mid(Join(m_, ""), 1, rndInt(mi, ma))
End Function
End Class
Dim goRpl : Set goRpl = Nothing
Function magic(m, w, mi, ma, p, src)
If IsEmpty(ma) Then ma = mi
magic = goRpl.m_dicGens(w).getNext(mi, ma)
End Function
Class cRpl
Private m_fRpl
Private m_r
Public m_dicGens
Private Sub Class_Initialize()
Set m_fRpl = GetRef("magic")
Set m_r = New RegExp
m_r.Pattern = "\(\w){(\d+)(?:,(\d+))?}"
Set m_dicGens = CreateObject("Scripting.Dictionary")
Set m_dicGens("d") = New cRGen.init("0123456789")
Set m_dicGens("S") = New cRGen.init("abcdefghij")
End Sub
Public Function rpl(s)
Set goRpl = me
rpl = m_r.Replace(s, m_fRpl)
End Function
End Class
Randomize
Dim aTests : aTests = Array( _
"LGP0041_\d{4}.dta" _
, "objd135a_\S{3}.txt" _
, "x_\S{3,8}.txt" _
)
Dim oRpl : Set oRpl = New cRpl
Dim sTest
For Each sTest In aTests
WScript.Echo sTest, "=>", oRpl.rpl(sTest)
Next
输出:
cscript 28936688.vbs
LGP0041_\d{4}.dta => LGP0041_4317.dta
objd135a_\S{3}.txt => objd135a_cea.txt
x_\S{3,8}.txt => x_jgcfidh.txt
cscript 28936688.vbs
LGP0041_\d{4}.dta => LGP0041_8054.dta
objd135a_\S{3}.txt => objd135a_eci.txt
x_\S{3,8}.txt => x_ahfgd.txt
这至少应该确定所需的组件:
- 提供特定字符集字符串的生成器
- a(抱歉:全局)替换将 'type letters' 映射到生成器、处理 'width specs' 并构建输出
的函数
- 从您的输入中解析规格的常规模式
我有一个巨大的文件,其中包含带有正则表达式的值,如下所示:
LGP0041_\d{4}\.dta
objd135a_\S{3}.txt
现在我需要将它们转换为有效的示例值,如下所示:
LGP0041_1234.dta
objd135a_abc.txt
我知道 RegExp
对象可以检查是否存在匹配项,但是否还有创建有效值的方法?
可以使用正则语法来识别或生成其语言的单词,但VBScript正则表达式引擎不实现生成。所以你必须自己动手。
您的示例不包含常规模式。 \S
不能表示 'non-whitespace',因为您不会喜欢文件名中的非法字符,并且典型的文件名示例应该包含带空格的元素。第一个示例转义了扩展点而第二个示例并没有让我认为您的语法规范没有经过深思熟虑。如果您提出了输入的(常规)语法,我愿意进一步考虑您的问题。
思考的一些代码:
Option Explicit
Function rndInt(lowerbound, upperbound)
rndInt = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
End Function
Sub shuffleAD(aX)
' Durstenfeld's Permutation Algorithm
Dim J, K, Temp
For J = UBound(aX) To 1 Step -1
K = Int((J + 1) * Rnd) ' random number 0 - J
Temp = aX(J)
aX(J) = aX(K)
aX(K) = Temp
Next
End Sub ' shuffleAD
Class cRGen
Private m_
Public Function init(s)
Set init = Me
ReDim m_(Len(s) - 1)
Dim i
For i = 0 To UBound(m_)
m_(i) = Mid(s, i + 1, 1)
Next
End Function
Public Function getNext(mi, ma)
shuffleAD m_
getNext = Mid(Join(m_, ""), 1, rndInt(mi, ma))
End Function
End Class
Dim goRpl : Set goRpl = Nothing
Function magic(m, w, mi, ma, p, src)
If IsEmpty(ma) Then ma = mi
magic = goRpl.m_dicGens(w).getNext(mi, ma)
End Function
Class cRpl
Private m_fRpl
Private m_r
Public m_dicGens
Private Sub Class_Initialize()
Set m_fRpl = GetRef("magic")
Set m_r = New RegExp
m_r.Pattern = "\(\w){(\d+)(?:,(\d+))?}"
Set m_dicGens = CreateObject("Scripting.Dictionary")
Set m_dicGens("d") = New cRGen.init("0123456789")
Set m_dicGens("S") = New cRGen.init("abcdefghij")
End Sub
Public Function rpl(s)
Set goRpl = me
rpl = m_r.Replace(s, m_fRpl)
End Function
End Class
Randomize
Dim aTests : aTests = Array( _
"LGP0041_\d{4}.dta" _
, "objd135a_\S{3}.txt" _
, "x_\S{3,8}.txt" _
)
Dim oRpl : Set oRpl = New cRpl
Dim sTest
For Each sTest In aTests
WScript.Echo sTest, "=>", oRpl.rpl(sTest)
Next
输出:
cscript 28936688.vbs
LGP0041_\d{4}.dta => LGP0041_4317.dta
objd135a_\S{3}.txt => objd135a_cea.txt
x_\S{3,8}.txt => x_jgcfidh.txt
cscript 28936688.vbs
LGP0041_\d{4}.dta => LGP0041_8054.dta
objd135a_\S{3}.txt => objd135a_eci.txt
x_\S{3,8}.txt => x_ahfgd.txt
这至少应该确定所需的组件:
- 提供特定字符集字符串的生成器
- a(抱歉:全局)替换将 'type letters' 映射到生成器、处理 'width specs' 并构建输出 的函数
- 从您的输入中解析规格的常规模式