【问题标题】:Check if NSString is only letters检查 NSString 是否只有字母
【发布时间】:2015-06-07 23:11:34
【问题描述】:

确保 NSString 仅包含字母 a-z 和 A-Z 的最佳方法是什么。

我尝试了以下代码,但由于某种原因无法正常工作:

NSString *myegex = @"[A-Za-z]";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myregex];
if (![emailTest evaluateWithObject:self.initials.text])  {
     // print error
     return;
}

【问题讨论】:

  • “由于某种原因无法正常工作”是什么意思?是不是编译失败?它是否引发运行时异常?是否存在编译时错误?它是否产生了意想不到的结果(什么输入的结果是什么,与预期结果相比如何)?是发射导弹吗?发生了什么事?

标签: objective-c regex nsstring


【解决方案1】:

您可以通过创建自己的NSCharacterSet 然后使用rangeOfCharacterFromSet: 检查该字符串与该集合来以更简单的方式完成此操作

//Create character set
NSCharacterSet *validChars = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];

//Invert the set
validChars = [validChars invertedSet];

//Check against that
NSRange  range = [myString rangeOfCharacterFromSet:validChars];
if (NSNotFound != range.location) {

 //invalid chars found

}

【讨论】:

  • 很好,但我会使用 +[NSCharacterSet letterCharacterSet] 而不是硬编码所有字母。
  • @zpasternack 好吧,我看到他的字符串名为emailTest,并认为他正在尝试验证一个显然可以包含更多字母的电子邮件地址。避免复杂的正则表达式基本上是一种技巧,尽管在这种情况下,OP 可能正是需要它。
  • @zpasternack letterCharacterSet 包括句号标点和其他标记。 =(developer.apple.com/library/ios/documentation/Cocoa/Reference/…
  • @jungledev 不包括句号或标点;包括标记,the docs 将其定义为“...所有具有大于 0 的非间距优先级的合法 Unicode 字符。通俗地说,此集合是用作基本字符修饰符的所有字符的集合。”
  • @zpasternack,我理解文档中的解释(我提到它是为了弄清楚它不排除句点),但在实际使用中,句点不被排除,所以警告。也许这是一个 Obj-C 错误?我不知道。我正在处理 CodeEval “过山车”算法挑战 (codeeval.com/open_challenges/156),并花了很长时间调试我的解决方案为什么不起作用。它不起作用,因为 letterCharacterSet 不排除句点。
【解决方案2】:

我不确定 Objective-C 正则表达式引擎是如何工作的,但您可以利用锚点 ^$ 使用此正则表达式检查您的字符串是否以字母开头和结尾:

^[A-Za-z]+$

使用您的代码,将是:

NSString *myegex = @"^[A-Za-z]+$";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myregex];
if (![emailTest evaluateWithObject:self.initials.text])  {
     // print error
     return;
}

【讨论】:

    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2015-06-10
    • 2011-11-08
    • 2023-03-23
    • 2020-07-28
    • 2013-03-08
    相关资源
    最近更新 更多