我有一个问题。
我希望允许用户在瑞典语键盘上编写您可以看到的所有内容(不使用字符映射或类似内容)。这意味着所有英文字母数字字符和åäö
。允许使用的非字母数字字符为§½!"@#£¤$%&{/()[]=}?+\´`^
,依此类推。
我的表达是:
[\wåäö§½!"@#£¤$%&/{()=}?\\\[\]+´`^¨~'*,;.:\-_<>|]
在C#中它看起来像这样:
Regex allowedChars = new Regex("@[\\wåäö§½!\"@#£¤$%&/{()=}?\\\\[\\]+´`^¨~'*,;.:\\-_<>|]");
我检查一下:
if (allowedChars.IsMatch(mTextBoxUserName.Text.Trim()))
问题在于,如果我将一个有缺陷的字符与一个允许的字符一起编写,那么if语句会认为它是匹配的。我想让它与整个单词相匹配。我尝试在表达式的末尾添加一个“+”,但之后它从未匹配......
有什么想法吗?
答案 0 :(得分:6)
你应该锚定正则表达式^[...]+$
。
答案 1 :(得分:5)
两件事:
您的字符串错误地在字符串内部而不是字符串之前有@
个字符。这可能是复制粘贴错误,或者可能不是。
// 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åäö§½!""@#£¤$%&/{()=}?\[\]+´`^¨~'*,;.:\\_<>|-]+$");
答案 2 :(得分:2)
从字符串的开头删除@ - 你的正则表达式与你的C#等价物是不正确的。
@前缀超出引号@"anyStringHere"
,这意味着\
字符被视为字符串中的文字而不是转义字符。
另外,我假设您希望匹配仅由允许的字符组成的字符串,如果是这样,您应该锚定您的正则表达式:^[regexHere]+$
答案 3 :(得分:2)
你可以把^放在第一个[。这意味着它将匹配集合中不存在的任何字符。然后,对于包含列表中不存在的任何字符的字符串,IsMatch将返回True,因此对于有效字符串,它将返回False。
您将检查字符串是否无效,而不是检查字符串是否有效。