c#中的RegEx不像预期的那样工作
本文关键字:工作 中的 RegEx | 更新日期: 2023-09-27 18:18:23
我有一个问题。
我想要一个用户被允许写一切你可以看到在瑞典键盘上(不使用字符映射或类似)。这意味着所有英文字母数字字符和åäö
。允许的非字母数字字符为§½!"@#£¤$%&{/()[]=}?+'´`^
等。
我的表达是:
['wåäö§½!"@#£¤$%&/{()=}?'''[']+´`^¨~'*,;.:'-_<>|]
在c#中是这样的:
Regex allowedChars = new Regex("@[''wåäö§½!'"@#£¤$%&/{()=}?''''['']+´`^¨~'*,;.:''-_<>|]");
我检查了:
if (allowedChars.IsMatch(mTextBoxUserName.Text.Trim()))
问题是,如果我写一个错误的字符和一个允许的字符在一起,if语句认为它是一个匹配。我希望它能匹配整个单词。我试着在表达式的末尾添加一个"+",但它永远不匹配…
任何想法?
你应该锚定正则表达式^[...]+$
两件事:
-
您的字符串错误地将
@
字符放在字符串内部而不是字符串之前。这可能是复制粘贴错误,也可能不是。// put the @ outside the "" new Regex(@"['wåäö§½!""@#£¤$%&/{()=}?''[']+´`^¨~'*,;.:'-_<>|]");
-
您只检查中的一个是否存在,而不是只检查允许的字符。你可以使用锚定和重复来解决这个问题:
// 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。
您将检查字符串是否无效,而不是检查字符串是否有效。