VS10 中文件名的正则表达式格式有什么问题<regex>?

What's wrong in regex format for filenames in <regex> VS10?

本文关键字:lt regex gt 问题 什么 文件名 中文 正则表达式 格式 VS10      更新时间:2023-10-16

我试图在Visual Studio 2010中解析文件名路径。但是程序崩溃了Microsoft C++ exception: std::tr1::regex_error at memory location 0x001ef120..regex myRegEx("^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]\{2,6\})$");

正则表达式为^([a-zA-Z]:)(\[^\/:*?<>"|]*(?<![ ]))*(.[a-zA-Z]{2,6})$

regex格式有什么问题?

您也许可以通过将其切成块来缩小范围。分别计算原子,看看错误出现在哪里:

"^([a-zA-Z]\:).*$"
"^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*[.]*$"
"^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]+)$"
"^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]\{2,6\})$"

一个可能的问题是范围,"{2,6}"。如果你真的想要"2到6个字母",那么你不希望在范围的中间有反斜杠。真正的答案取决于你的解析器。

另外,如果对用反斜杠转义的内容感到困惑,请记住,通常可以通过将特殊字符放入一个范围来转义它们。例如,\可以等价于[], .肯定等价于[.]

首先,我不太了解c++ regex语法,但是,在我看来,\[意味着转义[字符。

我猜你应该像[一样编码,如果你想要一个否定的字符类[^\/:*?<>"|]

^([a-zA-Z]:)([^\/:*?<>"|]*(?<![ ]))*(.[a-zA-Z]{2,6})$

tr1::regex不支持向后看,所以它阻塞了"(?<![ ])"

不幸的是,我不是一个足够的regex用户,不能给你指导你可以用什么代替