以下正则表达式应在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
如何解决这个问题,或者如何正确地解决这些问题呢?谷歌搜索没有任何帮助。
答案 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);
}
}