C#中的正则表达式查找包含[|]的所有文件夹名

C#中的正则表达式查找包含[|]的所有文件夹名,c#,regex,C#,Regex,以下正则表达式应在C#中处理: 我要查找包含“[”或“]”的所有字符串 它应该在以下字符串中匹配 ...an folder ] ... ...and ] another... ...[so] this is... ...and [ a few more]... ...lorem ipsum[... 以下代码无法编译: string pattern ="\.*(\[|\])\.*"; List<string> directoriesMatchingPattern= Util.Get

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

我要查找包含“[”或“]”的所有字符串

它应该在以下字符串中匹配

...an folder ] ...
...and ] another...
...[so] this is...
...and [ a few more]...
...lorem ipsum[...
以下代码无法编译:

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

如何解决这个问题,或者如何正确地逃脱这个魔咒?谷歌搜索around一点帮助都没有。

跳出模式字符串:

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


要更深入地了解字符串和字符串转义序列,请查看此处。

转义模式字符串:

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

要更深入地了解字符串和字符串转义序列,请查看此处。

您应该使用使转义对正则表达式更有意义。我不确定您想用
\.*
做什么,但是
匹配
在默认情况下只匹配其中的一部分,所以我认为没有必要。我将使用以下模式:

@"(\[|\])"
为了提高性能,请创建一个对象,而不是使用static
Regex
方法(因为您正在重用该模式)。您不需要指定
IgnoreCase
,因为这里不关心字母,只关心
[]
符号

Regex myRegex = new Regex(@"(\[|\])");
// later, in loop
Match match = myRegex.Match(directoryName);
您应该使用使转义对正则表达式更有意义。我不确定您想用
\.*
做什么,但是
匹配
在默认情况下只匹配其中的一部分,所以我认为没有必要。我将使用以下模式:

@"(\[|\])"
为了提高性能,请创建一个对象,而不是使用static
Regex
方法(因为您正在重用该模式)。您不需要指定
IgnoreCase
,因为这里不关心字母,只关心
[]
符号

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

根据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;
}
public static List getsubfolders匹配(字符串attachmentDirectory,字符串模式)
{
正则表达式正则表达式=新正则表达式(模式);
返回GetSubfoldersMatch(attachmentDirectory,regex);
}
公共静态列表GetSubFoldersMatching(字符串attachmentDirectory,Regex Regex)
{
列表匹配=新列表();
foreach(Directory.GetDirectories中的字符串directoryName(attachmentDirectory))
{
Match=regex.Match(directoryName);
如果(匹配成功)
{
匹配.Add(directoryName);
}
其他的
{
AddRange(GetSubFoldersMatching(directoryName,regex));
}
}
返回匹配;
}

根据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;
}
public static List getsubfolders匹配(字符串attachmentDirectory,字符串模式)
{
正则表达式正则表达式=新正则表达式(模式);
返回GetSubfoldersMatch(attachmentDirectory,regex);
}
公共静态列表GetSubFoldersMatching(字符串attachmentDirectory,Regex Regex)
{
列表匹配=新列表();
foreach(Directory.GetDirectories中的字符串directoryName(attachmentDirectory))
{
Match=regex.Match(directoryName);
如果(匹配成功)
{
匹配.Add(directoryName);
}
其他的
{
AddRange(GetSubFoldersMatching(directoryName,regex));
}
}
返回匹配;
}

只需在图案前面添加@:

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);
            }
        }
List n=新列表();
n、 AddRange(新字符串[]{“一个文件夹]”,
“和]另一个”,
“不是这个”,
“[所以]这是”,
“还有[更多]”,
“或者num2”,
“lorem ipsum[“}”;
字符串模式=@“(\[\])”;//您不需要\.*部分
List directoriesmachingpattern=new List();
foreach(n中的字符串d)
{
if(Regex.Match(d,pattern.Success)
{
directoriesMatchingPattern.Add(d);
}
}

只需在图案前面添加@:

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);
            }
        }
List n=新列表();
n、 AddRange(新字符串[]{“一个文件夹]”,
“和]另一个”,
“不是这个”,
“[所以]这是”,
“还有[更多]”,
“或者num2”,
“lorem ipsum[“}”;
字符串模式=@“(\[\])”;//您不需要\.*部分
List directoriesmachingpattern=new List();
foreach(n中的字符串d)
{
if(Regex.Match(d,pattern.Success)
{
directoriesMatchingPattern.Add(d);
}
}

请注意,括号内的
\..*
在这种情况下是无用的,
(\[\\]])
也可以被写为更简单的
[\].
。请注意括号内的
\.
在这种情况下是无用的,
(\[\[\\]])
也可以被写为更简单的
[\]]
。由于正则表达式在默认情况下将匹配字符串中的任何位置,因此在模式的开头和结尾不需要使用
*
。以下操作应该可以正常工作:
字符串模式=@“[\[\]]”;
由于正则表达式在默认情况下将匹配字符串中的任何位置,因此在模式的开头和结尾不需要使用
*
。以下操作应该可以正常工作:
string模式=@“[\[\]]”;