Поиск строки и соответствующее переформатирование

Я работал над сценарием VBScript, который находит все файлы с определенным расширением, .dat, ищет определенный шаблон, «Дата истечения: \ d {8}», и перемещает строку в определенном формате.

У меня две проблемы с приведенным ниже кодом:

  • Это не чтение первой строки. Каждый раз, когда я запускаю сценарий, кажется, что он сразу же переходит ко второй строке.
  • Он использует только первый найденный шаблон и заменяет следующие шаблоны первым шаблоном в новом формате.

Я надеюсь, что это имеет смысл, это очень специфический сценарий, но я надеюсь на некоторую помощь в понимании проблемы.

Ниже мой код:

Set fso = CreateObject("Scripting.FileSystemObject")

'newtext = vbLf & "Date Due:" & sub_month & sub_day & sub_year 'the text replacing Date Due:

'the purpose of this script is to format the date after Date Due:, which is currently formatted as YYYYMMDD, to MM/DD/YYYY
'example: Date Date:20180605 should be Date Due:06/05/2018
Set re = New RegExp
re.Pattern = "(\nDate Due:\d{8})" 'Looking for line, Date Due: followed by 8 digits
Dim sub_str 'substring of date due, returns the 8 digits aka the date 12345678
Dim sub_month
Dim sub_day
Dim sub_year
Dim concat_full
re.Global = False
re.IgnoreCase = True

For Each f In fso.GetFolder("C:\Users\tgl\Desktop\TestFolder\").Files
    If LCase(fso.GetExtensionName(f.Name)) = "dat" Then
        text = f.OpenAsTextStream.ReadAll
        sub_str = Mid(text, 10, 8) 'substring of the full line, outputs the 8 digit date
        sub_month = Mid(sub_str, 5, 2) 'substring of the date, outputs the 2 digit month
        sub_day = Mid(sub_str, 7, 2) 'substring of the date, outputs the 2 digit day
        sub_year = Mid(sub_str, 1, 4) 'substring of the date, outputs the four digit year
        newtext = vbLf & "Date Due:" & sub_month & "/" & sub_day & "/" & sub_year 'replaces the text pattern defined above and concatenates the substrings with slashes
        'concat_full = (sub_month & sub_day & sub_year)
        f.OpenAsTextStream(2).Write re.Replace(text, newtext)
    End If
Next

Обновлено: При изменении re.Global на True он заменяет каждую строку одним найденным шаблоном. Он должен использовать каждый найденный шаблон как собственный, а не первый, который он найдет.

1
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте ваше регулярное выражение более конкретным и используйте группы захвата для извлечения соответствующих под совпадений:

re.Pattern = "(\nDate Due:)(\d{4})(\d{2})(\d{2})"

затем замените совпадения следующим образом:

re.Replace(text, "$1$4/$3/$2")

$1 - $4 в строке замены - это обратные ссылки на группы захвата в шаблоне (т. Е. Они заменяются соответствующей захваченной подстрокой).

Другие вопросы по теме