【问题标题】:Trouble removing entire line in VBS with regex使用正则表达式在 VBS 中删除整行时遇到问题
【发布时间】:2016-11-30 17:08:34
【问题描述】:

我正在尝试使用正则表达式从文本文件中删除整行(包括换行符)。

这是我的代码:

Do Until objFileToRead1.AtEndOfStream
    nline = objFileToRead1.ReadLine()
    regEx.Pattern = ".*to "
    nline = regEx.Replace(nline, "")
    objFileToRead2.WriteLine nline
Loop

这很好,可以按预期工作。 所以,如果我的文本文件包含:

哈哈哈 hehehehe to hihihihi 嗬嗬到

变成:

(空行) hehehehe to hihihihi (空行)`

但是,我不想要这样的空白。我已经尝试过使用regEx.Pattern = ".*to \r\n",但似乎正则表达式中的\r\n 不起作用,每次我尝试运行脚本时它都不会删除任何东西(因为搜索没有找到任何东西)。还尝试用括号和方括号封装表达式,但没有运气。

有什么建议吗?

【问题讨论】:

  • 是不是表示你的nline有匹配时是空的?只需在写入文件之前检查它 - If Len(nline) > 0 Then objFileToRead2.WriteLine nline
  • @WiktorStribiżew 实际上,我正在尝试用 to 结尾的每一行替换,除了这个“什么都没有”意味着应该删除该行而不是保持空白。
  • 阅读下面的解决方案。问题是你仍然用.WriteLine 写空行

标签: regex vbscript


【解决方案1】:

ReadLine 读取流中的下一行。结果不包含换行符,因此没有 \r\n 供您的正则表达式匹配。

为了防止输出出现空行,当nline 为空时不要调用WriteLine。或者,在您的情况下,仅当它与您的正则表达式模式不匹配时才将行写入输出。

我会这样做:

Set regEx = New RegExp
regEx.Pattern = "to \S+"

Do Until objFileToRead1.AtEndOfStream
    line = objFileToRead1.ReadLine
    If Not regEx.Test(line) Then objFileToRead2.WriteLine line
Loop

补充说明:

  • 无需在循环中不断重新定义正则表达式模式。
  • 由于您似乎在寻找固定字符串,因此可能不需要正则表达式。你可以使用InStr() function 来做到这一点。对于大型输入文件,会有性能优势。

【讨论】:

  • 您的模式将匹配(因此跳过)“hehehehe to hihihihi”。
  • 你是对的。根据 OP 的原始正则表达式修复。
  • 嘿,我已经根据@Ekkehard.Horner 的答案进行了编码。最后,代码变得与您的答案几乎相同。还是谢谢!!
  • 是的,我正在写它,却没有看到他已经写了一个非常相似的答案。不用担心。 :)
  • @Adami - 你应该接受最好的而不是第一个答案。
【解决方案2】:

之后

nline = objFileToRead1.ReadLine()

nline 不包含尾随 vbCrLf resp。 \r\n,所以你的新 RegExp 不能匹配。

如果您只希望在“to”之后只包含有趣的内容,只需将 .WriteLine 写入输出文件仅当 nline 匹配“to \S+$”(to,一个空白,一个或更多非while空间然后结束)。即:忘记替换。

【讨论】:

  • 谢谢,这启发了我。我必须将正则表达式调整为“to \S+”,因为在行尾之前还有更多文本。
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多