【发布时间】:2014-07-25 18:00:48
【问题描述】:
我已经检查了很多关于在 vba 中修剪前导和尾随空格的建议(顺便提一下,excel)。
我找到了这个解决方案,但它也修剪了 å ä ö(也是大写字母),而且我的正则表达式太弱了,看不出原因:
Function MultilineTrim (Byval TextData)
Dim textRegExp
Set textRegExp = new regexp
textRegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}"
textRegExp.Global = False
textRegExp.IgnoreCase = True
textRegExp.Multiline = True
If textRegExp.Test (TextData) Then
MultilineTrim = textRegExp.Replace (TextData, "$1")
Else
MultilineTrim = ""
End If
End Function
(这是来自 SO 的答案,其中用户帐户似乎处于非活动状态:
https://stackoverflow.com/a/1606433/3701019 )
因此,如果有人可以提供 (a) 问题的替代解决方案或 (b) 不会删除(单个)åäö 字符的正则表达式/代码版本,我会很高兴。
感谢您的帮助!
详情: 问题
- vba 中的修剪函数不考虑所有空白字符(例如制表符)。需要一些自定义修剪
- 上面是我找到的最佳解决方案,但它也删除了单个 å ä ö 字符。
我的上下文是 vba 中的 xmlparser,它获取要解析的 xml 块。有时它只是从流中获取一个字符,可能是 å ä ö,然后此函数将其完全剥离。
当然,我很乐意澄清或编辑这个问题。
仅供参考:我已经根据答案准确地分享了我所做的事情,见下文。
【问题讨论】:
-
Regex 可能不是解决这个问题的正确方法:它们可以工作,但速度很慢,每次调用
Trim()函数时,您最终都会创建一个新的 Regex 对象,这如果在从 text/xml 文件中解析令牌时使用该函数,可能会很多并且会增加很多开销。我会在这方面走老路,并简单地使用老式的字符串操作函数。 -
感谢您的回复。你是对的,没有实例!但我认为没有必要每次都实例化正则表达式。在将这个小 sn-p 添加到我的代码中时,我将它放在一个类中并重用正则表达式,因此只创建一个实例。一般来说,(数据检索)代码的性能瓶颈在别处。
-
如果您只是将其用作普通的辅助函数,则不一定需要创建一个类。您可以只使用
Static声明而不是Dim作为函数本身内部的正则表达式,并在第一次使用时对其进行初始化。 -
关于我为什么回滚你的第二个版本的解释,请阅读Is it OK for users to edit the accepted answer into their question?
-
好的,@Air,谢谢。我读了你提到的帖子,但我不明白它想让我做什么。所以我asked specifically 并得到了一些其他的观点,所以现在我理解并添加了我在下面所做的事情。自然,接受的答案仍然保持不变,尽管它没有准确地捕捉到我所做的,我试图澄清这一点。