代码之家  ›  专栏  ›  技术社区  ›  char m

如何找出C/.NET 2.0中的字符串是否包含非字母数字字符?

  •  16
  • char m  · 技术社区  · 14 年前

    允许的字符是(至少)a-z、a-z、0-9、_¶、_–、_∙、∙和德语、拉脱维亚语、爱沙尼亚语(如有)特殊字符?是否有现成的方法,或者我必须使黑名单(不允许的字符)和正则表达式ismatch?如果没有现成的黑名单怎么用?

    4 回复  |  直到 11 年前
        1
  •  31
  •   Guffa    14 年前

    我不知道这些语言中的特殊字符是如何分类的,但您可以检查 Char.IsLetterOrDigit 方法匹配您要执行的操作。它至少对我测试的数字和字母有效:

    string test = "Aasdf345ÅÄÖåäöéÉóÓüÜïÏôÔ";
    if (test.All(Char.IsLetterOrDigit)) { ... }
    

    这个 字符IsletterDigit 对于按Unicode分类为大写字母、小写字母、标题字母、修改字母、其他字母或小数位数的字符,返回true。

        2
  •  6
  •   Flynn1179    14 年前

    调查 char.IsLetterOrDigit(char) .

    例如:

    myString.All(c => char.IsLetterOrDigit(c));
    
        3
  •  4
  •   Joey Gumbo    14 年前

    字符黑名单可能非常大:-)

    可以使用正则表达式

    ^[\d\p{L}]+$
    

    以匹配十进制数字和字母,不管脚本如何。

    这个正则表达式由一个字符类组成,该类包含 \d _“,包含每个数字(BMP中总共230个),以及 \p{L} 它包含所有被分类为“字母”的Unicode字符(BMP中的46817)。然后,所述字符类至少重复一次,并嵌入到 ^ $ _“字符串开始和结束锚定,因此它匹配完整的字符串。

    对于某些regex引擎,由于您只对拉丁字母感兴趣,显然,您也可以使用

    ^[\d\p{Letter}]+$
    

    但是,.NET不支持此功能。上面提到的第一个regex实际上捕获了 任何 脚本。因此,它将尽职匹配印度或阿拉伯数字和希伯来语,西里尔文和其他非拉丁语脚本。取决于你想要什么,这可能不合适。

    如果这造成了一个问题,那么我认为没有比显式列出您要允许的字符更好的选择。然而,我认为假设某种语言的文本总是局限于该语言的脚本是危险的。如果我用德语写一个捷克语或波兰语的名字,那么我可能需要的不仅仅是 [a-zA-ZäöüÄÖÜß] .

        4
  •  -1
  •   Brook Julias    14 年前

    匹配允许的字符捕获一个错误的返回会更简单。