将带有正则表达式的值转换为实际值

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

这至少应该确定所需的组件:

  1. 提供特定字符集字符串的生成器
  2. a(抱歉:全局)替换将 'type letters' 映射到生成器、处理 'width specs' 并构建输出
  3. 的函数
  4. 从您的输入中解析规格的常规模式