Невозможно увеличить числа, захваченные в группе 1 совпадений с регулярным выражением - PullRequest
0 голосов
/ 25 февраля 2019

Мне нужно увеличить все числа (которые не являются частью слова) на 1 в текстовом файле.Я попытался использовать шаблон \b(\d+)\b для захвата всех таких чисел, но я не могу увеличить (добавить 1 к ним) их в файле.

Ввод

text1
    1 5 7
hello world 5. This is Samurai 10 not samurai10.
text2

Ожидаемый вывод

text1
    2 6 8
hello world 6. This is Samurai 11 not samurai10.
text2

Моя попытка

const forReading = 1
set objFso = createObject("scripting.filesystemobject")
strFilePath = split(wscript.scriptFullName,wscript.scriptName)(0) & "haha.txt"
set objFile = objFso.openTextFile(strFilePath, forReading)
set objReg = new RegExp
With objReg
    .Global = True
    .ignoreCase = true
    .multiline = true
    .pattern = "\b(\d+)\b"
End With

    strTemp = objFile.readAll()
    strTemp = objReg.replace(strTemp,cint("$1")+1)      '<--Here, I am getting the "Type mismatch 'Cint'" error. I just wanted to increment the number which was captured in Group 1
    msgbox strTemp

set objFile = Nothing
set objFso = Nothing

Если я заменим строку strTemp = objReg.replace(strTemp,cint("$1")+1) на strTemp = objReg.replace(strTemp,"_$1_"), я получу следующий вывод, что означает, что я могу получить требуемые числа, которые необходимо увеличить:

enter image description here

Я просто не могу их увеличить.Буду очень признателен за любую помощь !!!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Просто замените код:

strTemp = objReg.replace(strTemp,cint("$1")+1)

на

set objMatches = objReg.execute(strTemp)
for each match in objMatches
    strTemp = left(strTemp, match.firstIndex) & replace(strTemp, match.value, cInt(match.value)+1, match.firstIndex+1, 1)
next
msgbox strTemp

Это вывод, который я получил:

enter image description here

Проверьте справку для replace function

0 голосов
/ 25 февраля 2019

С cint("$1") вы пытаетесь привести $1 строку к int, а не к самому захваченному числу.

Вы можете использовать следующий обходной путь:

Dim strTemp As String, val As String
Dim offset As Integer
Dim objReg As regExp

strTemp = "text1" & vbLf & "    1 5 7" & vbLf & "hello world 5. This is Samurai 10 not samurai10." & vbLf & "text2 "

Set objReg = New regExp
With objReg
    .Global = True
    .Pattern = "\b\d+\b"
End With

For Each m In objReg.Execute(strTemp) ' Get all the matches in the original string
    val = CStr(CInt(m.Value) + 1)  ' The incremented matched number value
    strTemp = Left(strTemp, m.FirstIndex + offset) _
        & val _
        & Mid(strTemp, m.FirstIndex + Len(m.Value) + offset + 1) ' Text before match, modified value, the rest
    offset = offset + Len(val) - Len(m.Value) ' Need this to calculate the right index of the next match since when incrementing, the strTemp length may differ from its original length and match indices will mismatch
Next m

enter image description here

Тот же код при использовании с регулярными выражениями strTemp = "ab2cd99def999" и "\d+" дает ожидаемое ab3cd100def1000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...