VBA正则表达式用于特殊字符

3
当用户为我的宏设置"另存为"输出名称时,我希望检查特殊字符是否会导致保存文件时出现错误-[\/:*?<>|]
我使用RegExp进行如下操作:
Dim regEx As New RegExp
Dim strSpecChar As String: strSpecChar = "*[\/:*?<>|]*" 'Compile Error here
Dim OutputFileName As String: OutputFileName = InputBox("Enter File Name")
With regEx
    .Global = True
    .MultiLine = True
    .IgnoreCase = True
    .Pattern = strSpecChar
End With
If regEx.Test(OutputFileName) Then
        'error msg
End If

我因为符号(|)导致编译出错,错误信息为“编译错误:无效字符”。我已经尝试用反斜杠转义该符号,但没有解决问题。有人能帮忙吗?我阅读了一些文章,包括这篇,但没能找到解决方法。
解决方案请查看blog.tkacprow.pl下面的评论和Alex的答案(他指出了一个打字错误并解释了错误代码5018)。请从以上strSpecChar变量中删除*

正则表达式可能有些过头了。Instr() 函数完全可以胜任。你最终会得到大约相同数量的代码行,但我会花时间提取一个 SafeFileName(filename as string) as string 函数。 - RubberDuck
1
为什么在“*[/:?"<>|]”的开头有一个号?这个号应该前面加上一些表达式。我认为你应该删除它,转义“|”,转义反斜杠并用“”替换“”。 - AnalystCave.com
为什么不使用文件对话框而是要构建自己的保存程序呢? - EStraka
正则表达式在VBA中可能不是最好的解决方案,但原因并非您所料。如果您要与其他人共享工作簿,他们可能没有在其计算机上安装RegEx引用。在许多组织中,许多“不重要”的库被剥离出其工作站安装映像。有时会影响某些用户而不是所有用户。这只是我最近与客户遇到的一个问题。 - Mr. Mascaro
2个回答

3

如果只是测试字符串中是否存在一组字符中的某个字符,实际上并不需要使用正则表达式引擎。可以直接使用VBA的Like运算符来完成相同的任务,无需引用外部库:

Const strSpecChar As String = "*[\/:*?<>|]*"
Dim OutputFileName As String: OutputFileName = InputBox("Enter File Name")
If OutputFileName Like strSpecChar Then
    MsgBox "Error Message"
End If

或者,如果您想将双引号作为要排除的字符之一包括在内:
Const strSpecChar As String = "*[\/:*?<>|""]*"

请注意在字符类内使用双倍双引号,以便告诉VBA将其包含在内而不是将其视为字符串的结尾。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Ron Rosenfeld

2

我没有检查你的正则表达式是否正确,但是你在正则表达式中包含了字符",而vba将其视为字符串的结尾。你可以使用chr(34)来替换双引号:

strSpecChar = "*[\/:*?" & Chr(34) & "<>]|*"

谢谢你发现了这个问题!现在正出现“运行时5018:对象'IRegExp2'的方法'Test'失败”的正则表达式引擎错误,如果我找到解决方案,我会发布另一个答案!谢谢! - user3968302
2
错误与使用不正确的正则表达式相关联。您可以在http://regex101.com/上测试自己的正则表达式。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接