VBScript регулярное выражение заменить головную боль - PullRequest
0 голосов
/ 21 июня 2011

У меня есть текстовый файл, который я пытаюсь обработать с помощью vbscript, он выглядит следующим образом:

111 ,   ,       ,Yes    ,Yes
222 ,   ,       ,Yes    ,Yes
333 ,   ,       ,Yes    ,Yes
444 ,   ,       ,Yes    ,Yes
555 ,   ,       ,Yes    ,Yes
666 ,   ,       ,Yes    ,Yes

Мне нужно удалить возврат каретки и табуляции, запятые и «да» (илирегулярное выражение "\ t, \ t, \ t \ t, Yes \ t, Yes"), чтобы получить этот вывод:

('111', '222', '333', '444', '555 ',' 666 ')

Я использую этот код:

Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(filePath, ForReading)

strText = objFile.ReadAll
objFile.Close
'chr(010) = line feed chr(013) = carriage return
strNewText = Replace(strText, "\t,\t,\t\t,Yes\t,Yes" & chr(013) & chr(010), "','") 

Set objFile = objFSO.OpenTextFile(filePath, ForWriting)
objFile.WriteLine strNewText
objFile.Close

Однако это не дает желаемого результата, если я возьму "" \ t, \ t, \ t \ t, Да \ t, Да "&" из замены удаляет возврат каретки, что нормально, но мне также нужно убрать запятые и "да", а также иметь ("в начале"и ') в конце.Я предполагаю, что я использовал регулярное выражение, но я не использовал много vbscript, поэтому я не уверен

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Вместо того, чтобы выискивать то, что вам не нужно, проще и с меньшей ошибкой сконцентрироваться на том, что вы хотите:

  Dim sExp   : sExp   = "('111','222','333','444','555','666')"
  Dim aLines : aLines = Array( _
      "111 ,   ,       ,Yes    ,Yes" _
    , "222 ,   ,       ,Yes    ,Yes" _
    , "333 ,   ,       ,Yes    ,Yes" _
    , "444 ,   ,       ,Yes    ,Yes" _
    , "555 ,   ,       ,Yes    ,Yes" _
    , "666 ,   ,       ,Yes    ,Yes" _
  )     
  Dim sAll : sAll = Join( aLines, vbCrLf )
  WScript.Echo sAll
  Dim reCut : Set reCut = New RegExp
  reCut.Global    = True
  reCut.MultiLine = True
  reCut.Pattern   = "^\d+"
  Dim oMTS : Set oMTS = reCut.Execute( sAll )
  If 0 = oMTS.Count Then
     WScript.Echo "Bingo A!"
  Else
     ReDim aNums( oMTS.Count - 1 )
     Dim nI
     For nI = 0 To UBound( aNums )
         aNums( nI ) = oMTS( nI ).Value
     Next
     Dim sRes : sRes = "('" & Join( aNums, "','" ) & "')"    
     If sRes = sExp Then
        WScript.Echo "QED:", sRes
     Else   
        WScript.Echo "Bingo B!"
     End If
  End If

вывод:

111 ,   ,       ,Yes    ,Yes
222 ,   ,       ,Yes    ,Yes
333 ,   ,       ,Yes    ,Yes
444 ,   ,       ,Yes    ,Yes
555 ,   ,       ,Yes    ,Yes
666 ,   ,       ,Yes    ,Yes
QED: ('111','222','333','444','555','666')

Аннотации:

Я использую массив для построения моей строки для обработки ( sAll ).Ваша строка ( strText ) происходит из файла.Итак:

  Dim sAll : sAll = Join( aLines, vbCrLf )
  ==>
  Dim sAll : sAll = objFile.ReadAll

Строка анализируется с помощью RegExp (reCut), ее шаблон ^ \ d + ищет последовательность ( + ) цифр ( \ d ) в начале ( ^ ) строки (не всей строки; поэтому атрибут MultiLine установлен в True).Результатом .Execute является коллекция совпадений (oMTS), связывающаяся с совпадениями.

Чтобы упростить объединение ожидаемого результата, значения соответствий копируются в массив (aNums).

Выражение "('" & Join( aNums, "','" ) & "')" объединяет элементы массива, используя разделитель (комбинатор?) ',' - для завершения результата нам нужна просто подходящая головка (' соответственно.хвост ') .

0 голосов
/ 21 июня 2011

Попробуйте это

(.*?)(?:\s*,){3}Yes\s*,Yes\r?

, вам нужно позаботиться о переводе строк, с Regexr \r все в порядке.Я поместил разрывы строк в регулярное выражение, потому что я хотел, чтобы он был необязательным, используя ? впоследствии.В противном случае последняя строка не будет заменена, если она не заканчивается переводом строки.

и заменяется на

'$1',

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

$1 - это содержимое первой группы захвата, в вашем случае в ней должна быть часть до первой запятой.

Смотрите это здесь, на Regexr

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