C#中的正则表达式查找包含[|的所有foldernames ]

时间:2014-01-10 14:42:37

标签: c# regex

以下正则表达式应在C#中处理:

我想查找包含'['或']'的所有字符串。

它应匹配以下字符串;

...an folder ] ...
...and ] another...
...[so] this is...
...and [ a few more]...
...lorem ipsum[...

以下代码不会编译:

string pattern ="\.*(\[|\])\.*";
List<string> directoriesMatchingPattern=  Util.GetSubFoldersMatching(attachmentDirectory,pattern);

实施:

     public static List<string> GetSubFoldersMatching(string attachmentDirectory, string pattern)
        {
            List<string> matching = new List<string>();
            foreach (string directoryName in Directory.GetDirectories(attachmentDirectory))
            {
                Match match = Regex.Match(directoryName, pattern, RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    matching.Add(directoryName);
                }
                else
                {
                    matching.AddRange(GetSubFoldersMatching(directoryName,pattern));
                }
            }
            return matching;
        }

Visual Studio显示的错误是:

Error   Unrecognized escape sequence

如何解决这个问题,或者如何正确地解决这些问题呢?谷歌搜索没有任何帮助。

4 个答案:

答案 0 :(得分:5)

转义模式字符串:

string pattern ="\\.*(\\[|\\])\\.*";

或者:

string pattern = @"\.*(\[|\])\.*";

有关字符串和字符串转义序列的更深入研究,请参见MSDN

答案 1 :(得分:2)

你应该使用verbatim strings让逃避对正则表达更有意义。我不确定您要对\.*做什么,但Match默认情况下只会匹配其中的一部分,所以我认为这不是必要的。我使用以下模式:

@"(\[|\])"

为了提高性能,请创建一个Regex对象,而不是使用静态Regex方法(因为您正在重用该模式)。而且您不需要指定IgnoreCase,因为您不关心此处的字母,只需[]符号。

Regex myRegex = new Regex(@"(\[|\])");
// later, in loop
Match match = myRegex.Match(directoryName);

答案 2 :(得分:0)

在Tim S.回答的基础上,您可以创建GetSubFoldersMatching作为重载函数,以便您可以将现有的Regex对象或字符串传递给它,它将处理它。通过重用Regex对象,您的性能也会略有提升。

public static List<String> GetSubFoldersMatching(String attachmentDirectory, String pattern)
{
    Regex regex = new Regex(pattern);
    return GetSubFoldersMatching(attachmentDirectory, regex);
}

public static List<String> GetSubFoldersMatching(String attachmentDirectory, Regex regex)
{
    List<String> matching = new List<String>();
    foreach (String directoryName in Directory.GetDirectories(attachmentDirectory))
    {
        Match match = regex.Match(directoryName);
        if (match.Success)
        {
            matching.Add(directoryName);
        }
        else
        {
            matching.AddRange(GetSubFoldersMatching(directoryName, regex));
        }
    }
    return matching;
}

答案 3 :(得分:0)

只需在模式前添加@:

string pattern =@"\.*(\[|\])\.*";

它会起作用。

以下是整个事情的一个例子。

        List<string>  n = new List<string>();
        n.AddRange( new string[] { "an folder ] ",
            "and ] another",
            "not this one",
            "[so] this is",
            "and [ a few more]",
            "OR num2 either",
            "lorem ipsum["});

        string pattern =@"(\[|\])"; // you don't need your \.* parts
        List<string> directoriesMatchingPattern = new List<string>();
        foreach (string d in n)
        {
            if (Regex.Match(d, pattern).Success)
            {
                directoriesMatchingPattern.Add(d);
            }
        }