vbscript正则表达式取代头痛

时间:2011-06-21 10:02:51

标签: regex vbscript replace

我有一个文本文件,我正在尝试使用vbscript进行处理,它看起来像这样:

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

我想要的是删除回车符和制表符,逗号和'是'(或正则表达式“\ t,\ t,\ t \ t \ t \ t,是\ t,是”)以提供此输出:

( '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 个答案:

答案 0 :(得分:1)

而不是追捕你不想要的东西,而是专注于你想要的东西更容易,更少犯错误:

  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 + 看起来 对于行的开头( ^ )的数字( \ )的序列( + )(不是 整个弦;这就是MultiLine属性设置为True的原因。 .Execute的结果是匹配集合(oMTS),包含匹配。

为了使预期结果的连接更容易, 匹配的值被复制到一个数组(aNums)。

"('" & Join( aNums, "','" ) & "')"表达式组合了数组 元素使用分隔符(组合器?)',' - 来完成结果, 我们只需要一个合适的头(' resp.s尾')

答案 1 :(得分:0)

试试这个

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

你需要处理换行符,Regexr \r没问题。我将换行符放入正则表达式中,因为之后我想使用?选择它。否则,如果最后一行没有以换行符结束,则不会替换它。

并将其替换为

'$1',

在这里,您将在最后获得一个额外的逗号。我目前还不确定如何处理这个问题。

$1是第一个捕获组的内容,在您的情况下,第一个捕获组之前的部分应该在其中。

here on Regexr