c#中的RegEx不像预期的那样工作

本文关键字:工作 中的 RegEx | 更新日期: 2023-09-27 18:18:23

我有一个问题。

我想要一个用户被允许写一切你可以看到在瑞典键盘上(不使用字符映射或类似)。这意味着所有英文字母数字字符和åäö。允许的非字母数字字符为§½!"@#£¤$%&{/()[]=}?+'´`^等。

我的表达是:

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

在c#中是这样的:

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

我检查了:

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

问题是,如果我写一个错误的字符和一个允许的字符在一起,if语句认为它是一个匹配。我希望它能匹配整个单词。我试着在表达式的末尾添加一个"+",但它永远不匹配…

任何想法?

c#中的RegEx不像预期的那样工作

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

两件事:

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

删除字符串开头的@ -你的c#等效正则表达式是不正确的。

@前缀出现在引号@"anyStringHere"之外,这意味着'字符在字符串中被视为文字而不是转义字符。

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

可以将^紧接在第一个[后面。这意味着它将匹配不在集合中的任何字符。如果字符串中包含不在列表中的字符,则IsMatch将返回True,如果字符串是有效的,则返回False。

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