有一段路径,现在想获取子文件夹名称的列表        static void Main(string[] args)
        {
            string str = @"C:\Users\Administrator\Desktop\新建文件夹\Word批量转换\WordBatchConversion\WordBatchConversion\bin\Debug\Data\测试";            Console.WriteLine(Regex.Match(str, @"((?<=\\)[\w\W]+$)?").ToString() );            Console.WriteLine(Regex.Match(str, @"(?<=\\)[\w\W]+$",RegexOptions.RightToLeft).ToString());            Console.ReadLine(); 
        } 
方法一:((?<=\\)[\w\W]+$)?  结果错误,匹配结果是全字符串。
            我的理解是 先界于\与$之间,表达式为(?<=\\)[\w\W]+$
            然后用?来最小匹配,就是( (?<=\\)[\w\W]+$ )?
            哪里错了?
方法二:结果匹配不到任何结果。请高手指点对了,强调一下,我想得到的最终结果是“测试”两个字。

解决方案 »

  1.   


    因为[\w\W]+中的\W,它可以匹配'\'斜杠。实际上\w\W互反,[\w\W]将匹配任何字符。
    这时表达式可以理解为,找到第一个'\',然后匹配任何字符到行尾。
      

  2.   

    这个需求用正则效率太低。建议用
    str.Substring(str.LastIndexOf('\\') + 1);
      

  3.   

    ()?不是最小匹配,应该是(?<=\\).+?$([\w\W]即.),你?加错地了。
    但是这样还是得不到“测试”。非贪婪不会穷举匹配,找出最小的那个。而是在匹配时,一匹配完就停下,不再继续。这时(?<=\\).+?$就好使了。
    我测试方法一方法二结果相同。另外,最后有\也是合法路径,这有个隐患。
    [^\\]*$就不好使了,我那方法也不对了。
    (?<=\\).+?$(RightToLeft)仍然可用,但会匹配到“测试\”
      

  4.   

    RightToLeft,[^/\\]+应该是最好的方法了(用/分隔路径也合法),才想到
      

  5.   

    substring 加lastindexof可以获取最后文件夹名称