天道酬勤,学无止境

检查 NSString 是否有特殊字符(Check NSString for special characters)

问题

我想检查一个 NSString 是否有特殊字符,即除了 az、AZ 和 0-9 之外的任何字符。

我不需要检查存在多少特殊字符或它们的位置,我只需要知道特定字符串是否包含任何字符。 如果是这样,那么我希望能够显示“错误!”或类似的内容。

例如, jHfd9982可以,但asdJh992@不行。

此外,不应允许带有重音符号、变音符号等的字母。

我该怎么办?

谢谢!

迈克尔

回答1
NSCharacterSet * set = [[NSCharacterSet alphanumericCharacterSet] invertedSet];

if ([aString rangeOfCharacterFromSet:set].location != NSNotFound) {
  NSLog(@"This string contains illegal characters");
}

您还可以使用正则表达式(此语法来自 RegexKitLite:http://regexkit.sourceforge.net):

if ([aString isMatchedByRegex:@"[^a-zA-Z0-9]"]) {
  NSLog(@"This string contains illegal characters");
}
回答2

这里的代码你可以用它来检查字符串是否有任何特殊字符

NSString *string = <your string>;

NSString *specialCharacterString = @"!~`@#$%^&*-+();:={}[],.<>?\\/\"\'";
NSCharacterSet *specialCharacterSet = [NSCharacterSet
                                       characterSetWithCharactersInString:specialCharacterString];

if ([string.lowercaseString rangeOfCharacterFromSet:specialCharacterSet].length) {                
    NSLog(@"contains special characters");
}
回答3

如果在字符串中找不到任何字符,您想使用字符集搜索 NSString,那么 rangeOfCharacterFromSet: 将返回 {NSNotFound, 0} 的范围

字符集类似于 [NSCharacterSet symbolCharacterSet] 或您自己的字符集。 请注意,您还可以反转字符集,以便您可以拥有一组可接受的字符

回答4

如果您想在编辑时从任何字符串(甚至文本字段文本)中删除特殊字符和数字,下面的这些行非常方便:

#define ACCEPTABLE_CHARACTERS @"!~`@#$%^&*-+();:=_{}[],.<>?\\/|\"\'0123456789"

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS];

    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

    return (![string isEqualToString:filtered]) ? NO : YES;
}
回答5

此代码仅允许 UITextField 输入中的数字。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
        return NO;
    else
        return YES;

}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iOS中的UITextField中的密码验证(Password validation in UITextField in iOS)
    问题 我的iPhone应用程序中有1个UITextfield作为密码。 我想通过以下验证来验证此文本字段。 必须至少10个字符必须至少包含一个小写字母,一个大写字母,一位数字和一个特殊字符有效的特殊字符为– @#$%^&+=^.*(?=.{10,})(?=.*d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%^&+=]).*$ 如何限制具有上述要求的UITextField ? 回答1 这就是我要做的。 验证应该在用户键入密码时在末尾进行,而不是在NSRegularExpression之间进行。我将不会使用NSRegularExpression 。 -(void)textFieldDidEndEditing:(UITextField *)textField{ int numberofCharacters = 0; BOOL lowerCaseLetter,upperCaseLetter,digit,specialCharacter = 0; if([textField.text length] >= 10) { for (int i = 0; i < [textfield.text length]; i++) { unichar c = [textfield.text characterAtIndex:i]; if(!lowerCaseLetter) {
  • HTML中NSString中的特殊字符(Special Characters in NSString from HTML)
    问题 我正在从XML源获取数据,并使用tbxml对其进行解析。 一切正常,直到我收到一个拉丁字母,如“é”,它将显示为:代码: é 我看不到NSString进行转换的正确方法。 有任何想法吗? 回答1 这似乎是一个非常普遍的问题。 在Objective-C / Cocoa Touch中检查HTML字符解码 回答2 您可以使用正则表达式。 正则表达式是所有问题的解决方案,也是所有问题的成因! :) 下面的示例至少在撰写本文时使用未发行的RegexKitLite 4.0。 您可以通过svn获取4.0开发快照: shell% svn co http://regexkit.svn.sourceforge.net/svnroot/regexkit regexkit 下面的示例利用新的4.0块功能来搜索并替换é 角色实体。 第一个示例是两者中的“较简单”。 它仅处理é类的十进制字符实体é 而不是é类的十六进制字符实体 。 如果可以保证永远不会有十六进制字符实体,那么应该没问题: #import <Foundation/Foundation.h> #import "RegexKitLite.h" int main(int argc, char *charv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
  • 如何检查目标C中的字符串是否仅包含字母数字字符?(How to check if a string only contains alphanumeric characters in objective C?)
    问题 我正在研究一个小的iPhone项目,我需要检查输入的userName是否仅包含字母数字字符? (AZ, az, 0-9 。我将如何检查它? 回答1 如果您不想为此任务引入一个正则表达式库... NSString *str = @"aA09"; NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 回答2 这将起作用: @implementation NSString (alphaOnly) - (BOOL) isAlphaNumeric { NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; return ([self rangeOfCharacterFromSet:unwantedCharacters].location == NSNotFound); } @end 回答3 您可以将此正则表达式库用于ObjectiveC。 使用以下正则表达式进行匹配: ^[a-zA-Z0-9]*$ 回答4
  • 如何在 NSString 中捕获特殊指示的 **characters** 并加粗中间的内容?(How to catch special indicated **characters** in an NSString and bold what's in between?)
    问题 我无法将指示的“**”字符对之间的任何字符加粗。 例如,在这个 NSString 中: "The Fox has ran **around** the corner." 应改为:“狐狸已经指日可待跑” 这是我的代码: NSString *questionString = queryString; NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:questionString]; NSRange range = [questionString rangeOfString:@"\\*([^**]+)\\*" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch]; if (range.location != NSNotFound) { [mutableAttributedString setAttributes:@{NSFontAttributeName:[UIFont fontWithName:AGHeavyFontName size:size]} range:range]; } [[mutableAttributedString mutableString]
  • 检查 NSString 是否包含任何数字并且长度至少为 7 个字符(Check if NSString contains any numbers and is at least 7 characters long)
    问题 所以我想我需要一个正则表达式来做到这一点,但我还没有用目标 c 做任何正则表达式,而且我已经有一年没有写过正则表达式了。 我认为它应该像 ((?=.*[0-9]).{7,1000}) 如何将其放入客观的 c 字符串比较中并评估结果? 我的正则表达式是否正确? 回答1 虽然正则表达式可能会起作用,但还有另一种方法: NSString *str = // some string to check for at least one digit and a length of at least 7 if (str.length >= 7 && [str rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound) { // this matches the criteria } 这段代码实际上检查的不仅仅是 0-9。 它也处理来自其他语言的数字。 如果你真的只想要 0-9 然后替换: [NSCharacterSet decimalDigitCharacterSet] 和: [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
  • 正则表达式以验证密码强度(Regex to validate password strength)
    问题 我的密码强度标准如下: 长度为8个字符大写2个字母 1个特殊字符(!@#$&*) 2个数字(0-9) 小写3个字母 有人可以请给我正则表达式。 必须通过密码满足所有条件。 回答1 您可以使用肯定的前瞻性断言来进行以下检查: ^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$ 肾小管连结 解释: ^ Start anchor (?=.*[A-Z].*[A-Z]) Ensure string has two uppercase letters. (?=.*[!@#$&*]) Ensure string has one special case letter. (?=.*[0-9].*[0-9]) Ensure string has two digits. (?=.*[a-z].*[a-z].*[a-z]) Ensure string has three lowercase letters. .{8} Ensure string is of length 8. $ End anchor. 回答2 您可以使用零长度正向提前查找来分别指定每个约束: (?=.{8,})(?=.*\p{Lu}.*\p{Lu})(?=.*[!@#$&*])(?=.*[0-9])(?=.*\p{Ll
  • 如何禁用iOS 8表情符号键盘?(How to disable iOS 8 emoji keyboard?)
    问题 是否有任何选项可以停止在iOS 8中显示表情符号键盘? 它在numpad和安全文本中不可用,但在电子邮件中可用。 如果无法禁用它,如何从表情符号中获取字符串值? 回答1 试试这个: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField isFirstResponder]) { if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) { return NO; } } return YES; } 有关更多信息,请参见此处。 编辑 : 您可以使用以下代码从键盘隐藏表情符号: txtField.keyboardType=UIKeyboardTypeASCIICapable; 编辑 : 使用“界面”构建器从键盘隐藏表情符号选择。 回答2 这适用于iOS 7和8: - (BOOL)textField:(UITextField *)textField
  • NSXMLParser无法解析特殊字符(重音符号)(NSXMLParser can't parse special characters (accents))
    问题 我正在使用NSXMLParser从URL解析xml(我的代码与此处几乎完全相同) 一些元素包含特殊字符(如“á”),这会导致单词likándre分裂为两个(á和ndre)。 这是我的loadXMLByURL -(id) loadXMLByURL:(NSString *)urlString{ tickets = [[NSMutableArray alloc] init]; NSURL *url = [NSURL URLWithString:urlString]; NSData *data = [[NSData alloc] initWithContentsOfURL:url]; parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; [parser parse]; return self;} 我很确定这是因为未设置编码(我认为它必须是NSUTF8StringEncoding),但是我不确定在哪里/如何应用它。 [更新]我的其余代码... - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI
  • iOS 6 UITextField Secure-如何检测退格清除所有字符?(iOS 6 UITextField Secure - How to detect backspace clearing all characters?)
    问题 在iOS 6中,如果您在安全文本字段中键入文本,更改为另一个文本字段,然后返回到安全文本字段并按退格键,则所有字符都将被删除。 我对这种情况很好,但是,我试图根据此安全文本字段中是否包含字符来启用/禁用按钮。 我知道如何确定字段中有哪些字符以及是否按了退格键,但是在确定如何检测是否清除所有字符时遇到了麻烦。 这是我用来获取字段新文本的委托方法,但是,如果退格是,我似乎无法弄清楚如何获取新文本(假设新文本只是一个空白字符串)。点击将清除所有字符。 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //returns the "new text" of the field NSString * text = [textField.text stringByReplacingCharactersInRange:range withString:string]; } 任何帮助深表感谢。 谢谢! 回答1 我用这个解决方案。 删除字符后,它不需要局部变量,并且可以正确设置光标位置。 这是这些解决方案的混搭: iOS 6和iOS 5中带有'secure
  • 如何在Objective C中使用XML解析发布具有特殊字符和泰语的字符串?(How to post string with special character and Thai Language using XML parsing in Objective C?)
    问题 我是iOS的新手,我面临有关发布包含特殊字符的字符串的问题。 我的代码在DidFinishLoading中是这样的: NSXMLParser *myNSXMLParserPostObj=[[NSXMLParser alloc]initWithData:myNSMDataPostFromServer]; myNSXMLParserPostObj.delegate=self; [myNSXMLParserPostObj parse]; NSLog(@"%@",myNSXMLParserPostObj.parserError); NSString *responseStringWithEncoded = [[NSString alloc] initWithData: myNSMDataPostFromServer encoding:NSUTF8StringEncoding]; //NSLog(@"Response from Server : %@", responseStringWithEncoded); NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[responseStringWithEncoded dataUsingEncoding:NSUnicodeStringEncoding
  • 在textField中仅允许使用字母(Allowing only alphabets in textField)
    问题 我想让UITextField只接受字符并在输入数字或特殊字符时显示错误。但是当我这样做时,当我输入字母时也显示错误。 NSString *FNameReg=@"[A-Za-z]"; NSPredicate *FNametest=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",FNameReg]; if(![FNametest evaluateWithObject:txtfirstname.text]) { lblvalidateFName.hidden=NO; [testScroll setContentOffset:CGPointMake( 0 , 74)]; return; } 现在,当我也输入字母时,也会显示错误。是吗? 回答1 创建一种验证方法,如下所示: -(BOOL) validateAlphabets: (NSString *)alpha { NSString *abnRegex = @"[A-Za-z]+"; // check for one or more occurrence of string you can also use * instead + for ignoring null value NSPredicate *abnTest = [NSPredicate
  • 如何限制UITextField中除点和下划线之外的特殊字符?(How can I restrict special characters in UITextField except dot and underscores?)
    问题 如何限制UITextField除点和下划线之外的特殊字符? 我已经尝试了下面的代码片段,但是没有运气: #define ACCEPTABLE_CHARECTERS @" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_." - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSCharacterSet *acceptedInput = [NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARECTERS]; if (![[string componentsSeparatedByCharactersInSet:acceptedInput] count] > 1){ NSLog(@"not allowed"); return NO; } else{ return YES; } } 回答1 尝试下面给出的代码块,对我来说很好。 SWIFT 3.0 let ACCEPTABLE_CHARACTERS =
  • 检查字符串c是否在目标c中是回文(Check if string is palindrome in objective c)
    问题 我正在尝试检查字符串是否是回文或不使用目标c。 我是编程新手,没有其他编程语言的经验,所以请多多包涵。 如果遇到这种情况,我会陷入困境,我想说的是,如果字符串中的第一个位置等于最后一个位置,则该字符串是回文。 我做错了什么? int main (int argc, const char * argv[]) { NSString *p = @"121" ; BOOL palindrome = TRUE; for (int i = 0 ; i<p.length/2+1 ; i++) { if (p[i] != p [p.Length - i - 1]) palindrome = false; } return (0); } 回答1 您正在尝试将NSString用作NSArray (或者可能类似于C字符串),这将无法正常工作。 相反,您需要使用NSString方法characterAtIndex:来测试字符。 回答2 除了不平衡的花括号外,从NSString访问字符比使用数组表示法还要复杂。 您需要使用characterAtIndex:方法characterAtIndex:您可以优化代码,方法是characterAtIndex:如果不可能实现回文,则可以跳出循环,并在for循环之外进行length调用。 NSString *p = @"121"; NSInteger length
  • 将 À 等特殊字符与常规 A 进行比较(compare special characters like À with regular A)
    问题 在某些语言中,有像À这样的字母,我看到对于表视图部分,原生 iOS 将À放在与A相同的部分下。 我想做同样的事情,我通过比较第一个字母来构建我的部分,所以我需要À将等于 A。 我尝试使用localizedCompare但我仍然不知道这两个是相等的。 有没有办法进行这种比较? 或归一化À所以它会是A ? 回答1 不要按照其他答案进行转换或转换。 首先,尝试-[NSString localizedStandardCompare:] 。 如果这不能满足您的要求, NSDiacriticInsensitiveSearch选项中的NSDiacriticInsensitiveSearch传递给NSString比较方法之一(例如-compare:options:range:locale: )。 您可能还想使用其他选项,例如NSCaseInsensitiveSearch 。 回答2 您可以先将其转换为常规字母,然后再进行比较。 NSString *originalStr = @"À béautiful day"; NSData *d = [originalStr dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *converted = [[NSString alloc]
  • 检查UITextField的输入是否仅为数字(Check that a input to UITextField is numeric only)
    问题 如何验证输入到UITextField的字符串? 我想检查字符串是否为数字,包括小数点。 回答1 我在Mac应用程序中使用此代码,相同或相似的代码应与iPhone一起使用。 它基于RegexKitLite正则表达式,并在文本无效时将其变为红色。 static bool TextIsValidValue( NSString* newText, double &value ) { bool result = false; if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) { result = true; value = [newText doubleValue]; } return result; } - (IBAction) doTextChanged:(id)sender; { double value; if ( TextIsValidValue( [i_pause stringValue], value ) ) { [i_pause setTextColor:[NSColor blackColor]]; // do something with the value } else { [i_pause setTextColor:[NSColor redColor]]; } } 回答2
  • 如何在Swift中检查一个字符串是否包含另一个字符串?(How do I check if a string contains another string in Swift?)
    问题 在Objective-C ,用于检查NSString的子字符串的代码为: NSString *string = @"hello Swift"; NSRange textRange =[string rangeOfString:@"Swift"]; if(textRange.location != NSNotFound) { NSLog(@"exists"); } 但是我该如何在Swift中做到这一点? 回答1 您可以使用Swift进行完全相同的调用: 雨燕4和雨燕5 在Swift 4中,String是Character值的集合,在Swift 2和3中不是这样,因此您可以使用以下更简洁的代码1 : let string = "hello Swift" if string.contains("Swift") { print("exists") } 迅捷3.0+ var string = "hello Swift" if string.range(of:"Swift") != nil { print("exists") } // alternative: not case sensitive if string.lowercased().range(of:"swift") != nil { print("exists") } 较早的斯威夫特 var string = "hello
  • 目标 c 不喜欢我的 unichars?(Objective c doesn't like my unichars?)
    问题 当我尝试执行以下操作时,Xcode 会抱怨“多字符字符常量”: static unichar accent characters[] = { 'ā', 'á', 'ă', 'à' }; 当并非所有字符都是 ascii 时,如何制作字符数组? 以下工作正常 static unichar accent[] = { 'a', 'b', 'c' }; 解决方法 我发现的最接近的工作是将特殊字符转换为十六进制,即这有效: static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 }; 回答1 并不是Objective-C 不喜欢它,而是C 不喜欢它。 常量'c'用于具有 1 个字节的char ,而不是具有 2 个字节的unichar 。 (有关更多详细信息,请参阅下面的注释。) 没有完全支持的方式来表示unichar常量。 您可以使用 char* s="ü"; 在 UTF-8 编码的源文件中获取 unicode C 字符串,或 NSString* s=@"ü"; 在 UTF-8 编码的源文件中获取NSString 。 (这在 10.5 之前是不可能的。iPhone 没问题。) NSString本身在概念上是编码中立的; 但是如果你愿意,你可以使用 -characterAtIndex: 来获取 unicode 字符。
  • 如何检测对NSTextAttachment的触摸(How to detect touch on NSTextAttachment)
    问题 检测用户NSTextAttachment在iOS上NSTextAttachment的最佳方法是什么? 我认为一种方法是检查carret位置上的字符是否为NSAttachmentCharacter ,但这似乎并不正确。 我也尝试过UITextViewDelegate方法-(BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange但是当textView.editable=YES时不会调用它 回答1 委托方法确实有效,但仅当附件在image属性中具有图像且可编辑=否时才有效! 因此,如果您将图像从其他位置粘贴到attributedString中,则似乎数据最终存储在fileWrapper中,并且下次您将attributedString重新放回textView中时,图像属性为nil,布局管理器或其他获取图像的对象从fileWrapper中。 在文档中的某处确实提到在NSTextAttachment中没有用于持久化图像属性的方法。 要测试此效果,请尝试从“照片”应用复制照片并将其粘贴到您的textView中,现在如果您按住手指,应该会弹出默认菜单。 现在,如果您保存此富文本
  • 检查字符串是否包含特殊字符(Check if a String contains a special character)
    问题 如何检查字符串是否包含特殊字符,例如: [,],{,},{,),*,|,:,>, 回答1 Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("I am a string"); boolean b = m.find(); if (b) System.out.println("There is a special character in my string"); 回答2 您可以使用以下代码从字符串中检测特殊字符。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class DetectSpecial{ public int getSpecialCharacterCount(String s) { if (s == null || s.trim().isEmpty()) { System.out.println("Incorrect format of string"); return 0; } Pattern p = Pattern.compile("[^A-Za-z0-9]"); Matcher m = p.matcher(s); // boolean
  • NSSortDescriptor问题(NSSortDescriptor issue)
    问题 我正在制作一个通讯录应用程序,从地址簿中获取名称并将其存储在Core数据中,并使用NSFetchedResultsController.However将名称显示在表上,但是出现的第一个索引和部分是#后跟字母。 但是我想像在本机联系人应用程序中那样做,即#索引应该最后出现。 我使用了以下NSortDescriptor : sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@“ fullName”升序:是]; 这里的“ fullName”是核心数据中的key ,该key是通过将名字和姓氏连接在一起而形成的。 如果fullName不是以字母开头,则段标识符是“ fullName”的第一个字母,其段标识符为#。 我已经搜索过它,并在NSortDescriptor比较器中使用了NSDiacriticInsensitiveSearch ,但是它没有用。 如果有人有任何想法,请告诉我。 这是我的代码: NSString *special = @"\uE000"; if ([[self sectionName:contactName] isEqualToString:@"#"]) { sortName = [special stringByAppendingString:contactName]; } else{ sortName