iOS 设置密码8-16位,必须包含字母和数字(可包含其他特殊字符)

本文介绍了两种不同的方法来验证密码的有效性,一种是利用正则表达式进行匹配,另一种则是通过查找至少一个数字和一个字母来实现。此外,还分享了一些实用的工具方法类,如验证手机号和中文字符等。

一开始写了个正则表达式,如下,发现并没有满足条件,下面这个是只能包含字母和数字

+(BOOL)judgePassWordLegal:(NSString *)pass{ 
 BOOL result = false; 
 if ([pass length] >= 8 && [pass length] <= 16){ 
 // 判断长度大于8位后再接着判断是否同时包含数字和字符 
 NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$"; 
 NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 
 result = [pred evaluateWithObject:pass]; 
 } 
 return result; 
}

通过想了下,其实只需要判断,这个字符串里面,至少包含一个数字和至少一个字母,其他可以包含 + - _,可以用如下表达式来判断
-(BOOL)isValidPasswordString
{
    BOOL result = NO;
    if ([self length] >= 8 && [self length] <= 16){
        //数字条件
        NSRegularExpression *tNumRegularExpression = [NSRegularExpression regularExpressionWithPattern:@"[0-9]" options:NSRegularExpressionCaseInsensitive error:nil];
        
        //符合数字条件的有几个
        NSUInteger tNumMatchCount = [tNumRegularExpression numberOfMatchesInString:self
                                                                           options:NSMatchingReportProgress
                                                                             range:NSMakeRange(0, self.length)];
        
        //英文字条件
        NSRegularExpression *tLetterRegularExpression = [NSRegularExpression regularExpressionWithPattern:@"[A-Za-z]" options:NSRegularExpressionCaseInsensitive error:nil];
        
        //符合英文字条件的有几个
        NSUInteger tLetterMatchCount = [tLetterRegularExpression numberOfMatchesInString:self
                                                                                 options:NSMatchingReportProgress
                                                                                   range:NSMakeRange(0, self.length)];
        
        if(tNumMatchCount >= 1 && tLetterMatchCount >= 1){
            result = YES;
        }

    }
    return result;
}

除此之外,个人还将开发中常用到的一些工具方法类进行了总结,诸如判断大陆手机号,判断中文字符等;大家有需要可以放在项目中使用,并再集成自己常用到的一些方法。

代码地址:ELPDevNormalTools

<think>我们正在Unity中实现一个登录输入框,要求用户输入8长度的字符串,且只能包含字母数字。我们可以使用InputField组件,并为其添加一个脚本来限制输入的内容长度。步骤:1.在UnityUI中创建一个InputField。2.设置InputField的字符限制(CharacterLimit)为8。3.为InputField添加一个脚本,用于过滤非字母数字字符。具体实现:我们可以通过监听InputField的onValueChanged事件,在输入变化时检查每个字符,移字母数字字符。注意:Unity的InputField组件有一个“ContentType”属性,我们可以设置为“Alphanumeric”,但这只能限制输入键盘的类型,不能确保不输入特殊字符(比如在某些输入法下)。因此,我们还需要在代码中进行过滤。脚本示例:创建一个名为“AlphanumericInputField”的脚本,并附加到InputField上。代码如下:```csharpusingUnityEngine;usingUnityEngine.UI;publicclassAlphanumericInputField:MonoBehaviour{privateInputFieldinputField;voidStart(){inputField=GetComponent<InputField>();if(inputField!=null){//添加监听,当输入变化时进行验证inputField.onValueChanged.AddListener(ValidateInput);}}privatevoidValidateInput(stringtext){//移字母数字字符stringcleanedText="";for(inti=0;i<text.Length;i++){charc=text[i];if(char.IsLetterOrDigit(c)){cleanedText+=c;}}//如果清理后的文本与当前输入不同,则更新if(cleanedText!=text){inputField.text=cleanedText;}//限制长度为8(CharacterLimit已经设置,这里也可以不处理,但为了确保不超过8,我们可以再截断)if(cleanedText.Length>8){inputField.text=cleanedText.Substring(0,8);}}}```但是,上面的代码在清理文本后直接设置inputField.text,这会导致光标置重置到末尾。如果用户正在中间插入字符,这可能会造成不好的体验。我们可以改进一下,只允许输入字母数字,并且长度不超过8。另一种方法是使用正则表达式,但Unity默认不支持System.Text.RegularExpressions,非我们使用.NET4.x或更高版本。所以我们可以根据项目设置选择使用正则表达式或者手动过滤。如果使用正则表达式(需要确保项目设置中使用了.NET4.x或更高版本):1.打开PlayerSettings(File->BuildSettings->PlayerSettings)2.在OtherSettings中找到Configuration,将ScriptingRuntimeVersion设置为.NET4.xEquivalent。然后修改脚本:```csharpusingUnityEngine;usingUnityEngine.UI;usingSystem.Text.RegularExpressions;publicclassAlphanumericInputField:MonoBehaviour{publicInputFieldinputField;publicintmaxLength=8;voidStart(){if(inputField==null)inputField=GetComponent<InputField>();if(inputField!=null){inputField.characterLimit=maxLength;//设置字符限制inputField.onValueChanged.AddListener(ValidateInput);}}privatevoidValidateInput(stringtext){//使用正则表达式替换非字母数字字符stringcleanedText=Regex.Replace(text,"[^a-zA-Z0-9]","");//如果清理后的文本长度超过最大长度,截断if(cleanedText.Length>maxLength)cleanedText=cleanedText.Substring(0,maxLength);//如果清理后的文本与当前输入不同,则更新if(cleanedText!=text){inputField.text=cleanedText;}}}```如果不使用正则表达式,我们也可以使用循环过滤,同时处理长度:```csharpusingUnityEngine;usingUnityEngine.UI;publicclassAlphanumericInputField:MonoBehaviour{publicInputFieldinputField;publicintmaxLength=8;voidStart(){if(inputField==null)inputField=GetComponent<InputField>();if(inputField!=null){inputField.characterLimit=maxLength;//设置字符限制inputField.onValueChanged.AddListener(ValidateInput);}}privatevoidValidateInput(stringtext){//如果文本为空,直接返回if(string.IsNullOrEmpty(text))return;//创建一个新的字符数组,只包含字母数字,并且不超过最大长度char[]chars=newchar[text.Length];intindex=0;for(inti=0;i<text.Length&&index<maxLength;i++){charc=text[i];if(char.IsLetterOrDigit(c)){chars[index]=c;index++;}}stringcleanedText=newstring(chars,0,index);//如果清理后的文本与当前输入不同,则更新if(cleanedText!=text){inputField.text=cleanedText;}}}```注意:直接设置inputField.text会触发onValueChanged事件,所以我们需要避免递归。但是在上面的代码中,我们设置text时会再次触发ValidateInput,但由于清理后的文本不会再被改变,所以不会无限递归。另外,我们也可以使用InputField的onValidateInput事件,它可以在每个字符输入时进行验证。但是,它只能验证单个字符,不能处理粘贴文本的情况。所以综合来看,使用onValueChanged更全面。使用方法:1.将脚本挂载到InputField游戏对象上。2.运行游戏,输入框将只允许输入字母数字,且长度不超过8。这样,我们就实现了输入框的限制。最后,在登录时,我们还需要检查输入框的文本长度是否为8(因为用户可能输入不足8字符)。在提交登录请求前,可以检查:```csharpif(inputField.text.Length!=8){//提示用户输入8字符}```但是,由于我们设置字符限制为8,并且过滤了非字母数字,所以用户输入的最大长度是8,但可能少于8。因此,在提交时检查长度是必要的。相关问题:1.如何防止用户复制粘贴非字母数字字符到输入框?2.如何让输入框在输入时自动转换为大写(或小写)?3.在Unity中,如何实现输入框获得焦点时自动弹出系统的键盘(移动端)?</think>### Unity UI Input Field 限制 8 字母数字登录实现 在 Unity 中实现输入框限制 8 字母数字登录功能,可通过以下方法完成: #### 方法 1:使用 Input Field 内置设置(简单实现) 1. **创建 Input Field** - 在 Hierarchy 中右键创建 `UI > Input Field` 2. **设置基础属性** ```csharp // 在 Inspector 中设置 Character Limit: 8 // 限制最大长度 Content Type: Alphanumeric // 只允许字母数字 ``` > 此方法简单但无法过滤粘贴的特殊字符[^1] #### 方法 2:脚本动态过滤(推荐) ```csharp using UnityEngine; using UnityEngine.UI; public class LoginInputRestrict : MonoBehaviour { [SerializeField] private InputField inputField; private const int MAX_LENGTH = 8; void Start() { inputField.characterLimit = MAX_LENGTH; inputField.onValueChanged.AddListener(FilterAlphanumeric); } private void FilterAlphanumeric(string input) { // 移字母数字字符 string filtered = System.Text.RegularExpressions.Regex.Replace( input, "[^a-zA-Z0-9]", "" ); // 截断超长输入 if (filtered.Length > MAX_LENGTH) filtered = filtered.Substring(0, MAX_LENGTH); if (filtered != input) inputField.text = filtered; } } ``` **实现说明:** 1. `onValueChanged` 监听输入变化 2. 正则表达式 `[^a-zA-Z0-9]` 过滤非字母数字字符 3. 自动截断超长内容 4. 需要附加到 Input Field 的 GameObject #### 方法 3:移动端键盘优化(Android/iOS) ```csharp // 在 Input Field 组件上设置 inputField.keyboardType = TouchScreenKeyboardType.ASCIICapable; inputField.inputType = InputField.InputType.Standard; ``` > 此设置可调出系统级字母数字键盘[^1] #### 登录验证示例 ```csharp public void OnLoginButtonClick() { if (inputField.text.Length != 8) { Debug.Log("必须输入8字符"); return; } // 执行登录逻辑 StartLogin(inputField.text); } ``` ### 注意事项 1. **粘贴内容处理**:脚本方法可过滤粘贴的特殊字符 2. **光标置**:修改 `inputField.text` 会重置光标,可通过 `inputField.caretPosition` 修复 3. **性能优化**:频繁的正则匹配可能影响性能,可在 `EndEdit` 事件中处理 --- ### 相关问题 1. 如何在 Unity 中实现输入框的实时错误提示? 2. 如何保存验证用户登录凭证? 3. 输入框获得焦点时如何自动弹出移动设备键盘? 4. 如何实现密码输入框的密文显示功能? 5. 输入框内容过滤会影响性能吗?如何优化? [^1]: Unity 官方文档中关于输入验证的限制说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值