C#中的RegEx无法正常工作

时间:2011-12-19 17:08:59

标签: c# asp.net regex

我有一个问题。

我希望允许用户在瑞典语键盘上编写您可以看到的所有内容(不使用字符映射或类似内容)。这意味着所有英文字母数字字符和åäö。允许使用的非字母数字字符为§½!"@#£¤$%&{/()[]=}?+\´`^,依此类推。

我的表达是:

[\wåäö§½!"@#£¤$%&/{()=}?\\\[\]+´`^¨~'*,;.:\-_<>|]

在C#中它看起来像这样:

Regex allowedChars = new Regex("@[\\wåäö§½!\"@#£¤$%&/{()=}?\\\\[\\]+´`^¨~'*,;.:\\-_<>|]");

我检查一下:

if (allowedChars.IsMatch(mTextBoxUserName.Text.Trim()))

问题在于,如果我将一个有缺陷的字符与一个允许的字符一起编写,那么if语句会认为它是匹配的。我想让它与整个单词相匹配。我尝试在表达式的末尾添加一个“+”,但之后它从未匹配......

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

你应该锚定正则表达式^[...]+$

答案 1 :(得分:5)

两件事:

  1. 您的字符串错误地在字符串内部而不是字符串之前有@个字符。这可能是复制粘贴错误,或者可能不是。

    // put the @ outside the ""
    new Regex(@"[\wåäö§½!""@#£¤$%&/{()=}?\\[\]+´`^¨~'*,;.:\-_<>|]");
    
  2. 您只检查是否存在一个允许的字符,而不仅仅是允许的字符。您可以使用锚定和重复来解决此问题:

    // anchor using ^ and $, use []+ to ensure the string is ONLY made
    // up from that character class. Also move the - to be the last symbol
    // to avoid inadvertent ranging
    new Regex(@"^[\wåäö§½!""@#£¤$%&/{()=}?\[\]+´`^¨~'*,;.:\\_<>|-]+$");
    

答案 2 :(得分:2)

从字符串的开头删除@ - 你的正则表达式与你的C#等价物是不正确的。

@前缀超出引号@"anyStringHere",这意味着\字符被视为字符串中的文字而不是转义字符。

另外,我假设您希望匹配仅由允许的字符组成的字符串,如果是这样,您应该锚定您的正则表达式:^[regexHere]+$

答案 3 :(得分:2)

你可以把^放在第一个[。这意味着它将匹配集合中不存在的任何字符。然后,对于包含列表中不存在的任何字符的字符串,IsMatch将返回True,因此对于有效字符串,它将返回False。

您将检查字符串是否无效,而不是检查字符串是否有效。