使用正则表达式查找模式时,范围倒序错误?

3

我将根据正则表达式进行子目录查找。

当我使用以下正则表达式模式时,一切都运行得很好。

Dim sPattern As String = "^[/C:\/Users\/parth.jani\/Documents\/New folder\/b\/Photo_](.*)[_Order1]$"

但是如果我有以下模式,它会抛出[x-y] 范围倒序的错误。

Dim sPattern As String = "^[/C:\/Users\/parth.jani\/Documents\/New folder\/b\/Photo_](.*)[_Order-1]$"

我知道是"-"字符导致了错误:

[_Order-1]$

如果有人能帮忙,我将不胜感激。:-)

1个回答

3
-字符在正则表达式中具有语义意义,特别是当它被包含在[]中时。如果这是您需要匹配的文件名的部分,则应使用\-对其进行转义
总的来说,在表达式中使用[]似乎不合适,因为它表示可能字符的范围,而不是序列。如果您需要将其中内容视为单独组,请改用(),例如:
"^(C:\\Users\\parth.jani\\Documents\\New folder\\b\\Photo_)(.*)(_Order\-1)$"

如果您担心这些不能与捕获组匹配(即,如果您只需要捕获(.*)部分),那么请在其他组的开头添加?:,以便匹配器将忽略它们:

"^(?:C:\\Users\\parth.jani\\Documents\\New folder\\b\\Photo_)(.*)(?:_Order\-1)$"

注意:我已将路径分隔符从"\/"更改为"\\",因为前者是无效的。如果您仍然没有找到匹配项,并且您正在运行此代码以搜索文件,请检查您的文件是否具有扩展名。当前的模式期望路径没有文件扩展名(即目录名称或没有扩展名的文件)。如果您使用类似于Directory.GetAllFiles()的方式检索带有扩展名的文件并运行您的代码,则调用将包括具有扩展名的文件名,并且正则表达式将无法与它们匹配。之所以添加这个说明,是因为如果您在 Windows 上使用默认的操作系统选项,则会隐藏已知文件类型的扩展名,因此您预期的路径可能不是正则表达式所评估的路径。


我尝试了您建议的解决方案,但它没有给出匹配目录的结果。Regex.IsMatch始终返回false,即使目录名匹配(例如:C:\Users\parth.jani\Documents\New folder\b\Photo_usr_Order-1)。 - jparthj
@jparthj,我修改了正则表达式。你的转义序列让我感到困惑 - Windows 路径使用 "" 符号,并以这种方式进行转义 "\",而不是 ""。我在这里测试了上面的代码,所以它是有效的:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx - Ivaylo Slavov
@lvaylo slavov:我只获取子目录,不获取文件。 - jparthj

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