2015-08-27 47 views
0

我真的很困惑。我已经在C#中编写了一段代码,该代码通过了可能的文件路径。如果它包含在正则表达式字符串中指定的字符,它应该返回false。然而,正则表达式函数Match拒绝找到任何匹配的东西(我甚至把它设置为一个我知道在字符串中的单数字符),导致了我的严重刺激。 的代码是:我怎么搞砸了我的正则表达式?

static bool letterTest(string pathway) 
{ 
    bool validPath = false; 
    char[] c = Path.GetInvalidPathChars(); 
    string test = new string(c); 
    string regex = "["+test+"]"; 
    string spTest = "^[~#%&*\\{}+<>/\"|]"; 

    Match match = Regex.Match(pathway, spTest); 

    if (!match.Success) 
    { 
     validPath = true; 
    } 

    return validPath; 
} 

我传递给它的字符串为:@"C:/testing/invalid#symbol"

我在做什么错误/误解与正则表达式,或者是比我搞砸了正则表达式以外的东西?

+2

这对于正则表达式不是问题,只需使用'string。Contains()' – Jonesopolis

+0

@Jonesopolis测试一个子字符串,但是'pathway.Any(c => Path.GetInvalidPathChars()。Contains(c))'会起作用。 – juharr

+0

如果你打算使用正则表达式,你应该尝试使用'string regex =“[”+ Regex.Escape(test)+“]”;'。由于您获取的文件夹路径中不能使用的符号数组,并且它们包含特殊的正则表达式元字符,所以它是处理该问题最安全的方法。但是,在这里,您需要使用某些人提供的LINQ。 –

回答

1

从你的正则表达式中删除最初插入符号:

[~#%&*\\{}+<>/\"|] 

你要求的路径与那些字符中的一个开头。通过消除该约束,它将搜索整个字符串中的任何字符。

但是,为什么不使用框架为你做这项工作呢?

检查了这一点:Check if a string is a valid Windows directory (folder) path

+0

啊,谢谢你,我误解了插入符号的意思 – HadesHerald

-1

你要逃离/字面

"^[~#%&*\\{}+<>\/\"|]" 
+0

虽然这段代码可能回答这个问题,提供关于为什么和/或这个代码如何回答这个问题的额外的上下文来提高它的长期价值 – JAL

+0

这是错误的,正斜线在正则表达式中没有特别的意义,只有当它是被用作正则表达式*分隔符*,这在C#中不是问题 –

-2

加字符代表字符组的否定。从spTest中删除它解决了这个问题。

string spTest = "[~#%&*\\{}+<>/\"|]"; 
+0

插入符号仅用于字符类内部的否定,他是字符串开头的锚点。 – maksymiuk

1

除了正则表达式,您可以执行以下操作。

static bool letterTest(string pathway) 
{ 
    char[] badChars = Path.GetInvalidPathChars(); 
    return pathway.All(c => !badChars.Contains(c)); 
    // or 
    // return !pathway.Any(c => badChars.Contains(c)); 
    // or 
    // return badChars.All(bc => !pathway.Contains(bc)); 
    // or 
    // return !badChars.Any(bc => pathway.Contains(bc)); 
} 
0

有人已经指出将您的配对锚定到第一个字符的插入符号。但还有一个你可能还没有意识到的错误。这与你使用字符串文字有关。你现在有什么是传统的,C语言风格的字符串字面量:

"[~#%&*\\{}+<>/\"|]" 

...成为这个表达式:

[~#%&*\{}+<>/"|] 

双反斜线已经成为一个反斜杠,这被视为逃避以下大括号(\{)。括号不需要在字符类内部转义,但它不被视为语法错误。

但是,正则表达式不会按照您的意图检测到反斜杠。要做到这一点,你需要在正则表达式反斜杠,所以应该有反斜杠字符串文字中:

"[~#%&*\\\\{}+<>/\"|]" 

或者,你可以使用C#逐字字符串。反斜杠在逐字字符串中没有特殊含义。唯一需要特殊处理的是引号,您通过添加另一个引号来逃避:

@"[~#%&*\\{}+<>/""|]"