【问题标题】:How to parse Excel's cell string with regexp in VBA macro如何在 VBA 宏中使用正则表达式解析 Excel 单元格字符串
【发布时间】:2015-08-12 16:35:23
【问题描述】:

我正在 Excel 2010 中编写一个宏,以便删除列的多个单元格中的换行符。 实际上,我必须在单元格中搜索 5 个案例。 我列举如下:

  1. 如果有一个点或逗号,后跟一个空格,然后是一个换行符 (\n),请将其替换为点或逗号(在应用正则表达式之前的任何内容),后跟一个空格
  2. 如果有一个字符后跟空格,然后是换行符,则将其替换为字符和空格
  3. 如果有一个字符后跟换行符,则将其替换为字符 + 空格
  4. 如果有一个字符后跟两个空格,然后是一个换行符,则将其替换为字符 + 空格
  5. 如果行尾有一个点,请保持原样,因为它是一个结束点。

如您所见,2 和 3 非常相似,所以我认为正则表达式可能类似于 [a-zA-Z0-9]\n 但我不知道...首先,搜索换行符是否正确只需添加 \n其次,如何搜索空白空间。在检测到正则表达式之后,我认为可以用一个 .Replace(Text,"regexp","regexp ") 来解决,其中结尾的空格来自“char”+“”
所以基本上我的问题是,这种模式的正则表达式是什么? 在第 5 种情况下,如何搜索行终止符,使其不会尝试在段落的最后一个点之后搜索换行符。
我可以将 Chr(10) 用于换行,将 Chr(32) 用于空格吗?
顺便说一句,我一直在关注这些参考资料:
How to use RegExp
VBA Split strings

【问题讨论】:

  • 听起来您只是想查找以换行符结尾的文本,然后删除换行符。
  • 差不多,因为空格也很重要。我必须改进字符串使用的空间,但要保持可读性,因为它是一个固定的段落
  • 如果有一个点或逗号紧跟一个换行符怎么办?
  • 感谢您的观察,我还没有考虑过。与第一种情况相同,换行符应替换为空格
  • 看看我的回答是否符合你的需要。

标签: regex string vba excel


【解决方案1】:

此模式将查找任何字母数字字符 .,,后跟可选的空格,然后是换行符,并将其替换为匹配的结束字符,后跟一个空格。

Dim re
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "([\w.,])\s*\n"
strText = re.Replace(strText, "$1 ")

测试的输出。忽略括号。它们只是为了显示空间。

[the end.]     = [the end.]
[the end.\n]   = [the end. ]
[the end. \n]  = [the end. ]
[the end.  \n] = [the end. ]
[the end,]     = [the end,]
[the end,\n]   = [the end, ]
[the end, \n]  = [the end, ]
[the end,  \n] = [the end, ]
[the end]      = [the end]
[the end\n]    = [the end ]
[the end \n]   = [the end ]
[the end  \n]  = [the end ]

【讨论】:

  • nit-picking: \w 也匹配下划线 _ 例如:\w = [A-Za-z0-9_](在 vbscript 中)
  • strText = re.Replace(strText, "$1 ") 行正在替换直接在搜索文本中找到的模式,对吗?而$1是正则表达式处理的结果?
  • @Kronos - $1 代表第一个捕获组(在这种情况下,结束字符 .,)。因此,它只用结束字符加上一个空格来替换找到的整个模式。此外,正如@Ron 提到的,\w 包括下划线字符。如果您不想计算,我们需要改用[a-zA-Z0-9,.]
  • 捕捉什么取决于他在原始问题中的 character 是什么意思。可能就像(.) 一样简单;-)。
  • @RonRosenfeld - 是的。我确保在我的回答中指定 alphanumeric 但我忘记了_
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多