【问题标题】:Performing a Regex Expression on a String of which may contain Regex Metacharacters?对可能包含正则表达式元字符的字符串执行正则表达式?
【发布时间】:2013-08-24 16:39:36
【问题描述】:

我的应用程序的一个功能包括按部分名称检查文件夹路径(文件夹名称的格式如下:“ID 名称”,其中“ID”可以是任意数量的数字,“名称”可以包含任何有效的文件夹命名字符。

我只知道这些文件夹的“名称”部分,而不知道它们的“ID”。 我使用以下方法通过它们的“名称”(没有“ID”)检索这些文件夹:

Dim regDirs = New Func(Of String, Boolean)(Function(i) Regex.IsMatch(i, "[\d]+[\s]" & strName, RegexOptions.Compiled Or RegexOptions.IgnoreCase))

其中 'strName' 是包含名称但不包含 ID 的变量。这匹配任意数量的数字(作为 ID)加上空格字符,再加上名称。 然后我将这一行传递到:

Directory.EnumerateDirectories(dirRoot).Where(regDirs)

一切都很好,但仅适用于不包含正则表达式元字符的名称。

这就是我卡住的地方。我尝试将名称存储在一个变量中,该变量可以由另一个正则表达式在上述表达式之前检查,这将转义所有元字符 ([\^$.|?*+(){}),因此上述表达式不会考虑它们是特殊字符,但我不完全确定如何正确执行此操作或是否有更简单的方法。

我知道我可以使用普通的字符串替换来单独处理每个字符,例如:

Dim tempName as String = strName
tempName = tempName.Replace("[", "\[")

但是我会有多行做同样的事情,看起来不是很优雅,我也不确定它是否非常有效。

帮助感谢~

【问题讨论】:

    标签: regex vb.net string


    【解决方案1】:

    .NET 正是为此目的提供了Regex.Escape 方法:

    Dim regDirs = New Func(Of String, Boolean)(Function(i) Regex.IsMatch(i, "[\d]+[\s]" & Regex.Escape(strName), RegexOptions.Compiled Or RegexOptions.IgnoreCase))
    

    【讨论】:

    • 我花了 3 个小时在这个问题上胡思乱想,真不敢相信我错过了这么简单的事情。非常感谢~!
    • @Primula 很高兴我能提供帮助。请通过单击旁边的复选标记来考虑accepting the answer。这将向未来的访问者展示您的问题以及您的问题是如何解决的。它也会给我一些功劳(也给你一点功劳)。
    • 会的。虽然最后一件事,然后我如何取消转义以便可以将其作为目录找到?通过使用Regex.Escape,它将目录与转义版本进行比较。我不太确定我会把Regex.Unescape 放在哪里:Dim paths = Directory.EnumerateDirectories(dirRoot).Where(regDirs) 然后有一个循环For Each path In paths
    • @Primula 结果regDirs 将不包含转义字符。
    • 啊是的,没关系!这是因为我刚刚测试的字符串包含一个“。”实际文件夹名称中不存在。再次感谢您的帮助!
    猜你喜欢
    • 2011-06-27
    • 2011-07-22
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多