我的应用程序的一项功能包括按部分名称检查文件夹路径(文件夹名称的格式如下:“ID Name”,其中'ID'可以是任意数量的数字,'Name'可以包含任何有效的文件夹命名字符。
我只知道这些文件夹的“名称”部分,而不是他们的“ID”。 我使用它的'Name'(没有'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)
一切都运行得非常好,但仅适用于不包含Regex元字符的名称。
这就是我被困住的地方。我尝试将名称存储在一个变量中,其中的变量可以被另一个Regex Expression检查,然后上面的那个将转义所有元字符([\ ^ $。|?* +(){}),所以上面的表达式不会考虑它们作为特殊字符,但我不完全确定如何正确地执行此操作或是否有更简单的方法。
我知道我可以使用普通的字符串替换单独执行每个字符,如:
Dim tempName as String = strName
tempName = tempName.Replace("[", "\[")
但是我会有多条线做同样的事情,看起来不太优雅,我也不确定它是否也非常有效。
帮助赞赏〜
答案 0 :(得分:0)
.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))