Unity中Regex无法识别TextMeshPro文本的问题求助
问题描述
我是正则表达式新手,正在Unity游戏中实现玩家名称检测逻辑,要求名称仅由小写字母组成。但无论用正则还是str.All(char.IsLower)方法,都无法识别来自TextMeshProUGUI对象的纯小写字符串:
- 在测试平台验证
^[a-z]{1,7}$正则有效; - 手动赋值
name = "test"时检测正常,但用name = nameHolder.text.Trim()就失败; - 咨询过多个AI工具,给出的方案均未解决问题。
完整代码实现:
public TextMeshProUGUI nameHolder; //...Other functions... public async void UpdateHighScore() { name = "test";//works fine name = nameHolder.text.Trim(); //does not work if (name.Length <= 7 && name.Length > 0) { if (Regex.IsMatch(name, "^[a-z]{1,7}$")) { AmazonS3Client s3Client = new AmazonS3Client(accessKey, secretKey, new AmazonS3Config { RegionEndpoint = RegionEndpoint.USWest1, ServiceURL = "https://s3-us-west-1.amazonaws.com" }); PutObjectRequest putRequest = new PutObjectRequest { BucketName = bucketName, Key = filePath, ContentBody = Highscore.ToString() + "," + name }; try { await s3Client.PutObjectAsync(putRequest); Debug.Log("Highscore updated and uploaded successfully!"); text.text = "Name entered!"; } catch (AmazonS3Exception e) { Debug.LogError("Error updating highscore: " + e.Message); } } else { text.text = "Only use lowercase letters"; Debug.Log(name); } } else { Debug.Log(name.Length); text.text = "Name to long or short"; } }
排查与解决方案
1. 清理隐藏特殊字符
TextMeshProUGUI的输入可能包含Trim()无法处理的非标准空格(如Unicode U+00A0)、零宽字符或控制字符,导致检测失败。可以用以下方式彻底清理:
// 仅保留a-z小写字母,直接过滤所有其他字符 name = Regex.Replace(nameHolder.text, @"[^a-z]", ""); // 或者先移除所有不可见字符再Trim name = Regex.Replace(nameHolder.text, @"\p{C}", "").Trim();
2. 验证字符编码
在Debug中输出每个字符的Unicode编码,确认是否存在非ASCII小写字母或异常字符:
foreach (char c in name) { Debug.Log($"字符: {c}, Unicode编码: {(int)c}"); }
如果存在带重音的Unicode小写字母(如à、é),正则[a-z]会不匹配,可修改正则为^\p{Ll}+$匹配所有Unicode小写字母,或严格限制为a-z。
3. 检查TextMeshPro输入设置
- 查看Input Field的
Character Validation选项,是否设置为Lowercase,避免输入被自动格式化; - 排查是否有其他脚本在修改
nameHolder.text的值,导致文本被篡改。
4. 优化检测逻辑
替换为更可靠的逐字符检测,同时校验长度:
bool isValid = name.Length is >0 and <=7 && name.All(c => char.IsLower(c) && char.IsLetter(c));
或显式指定正则匹配选项,避免区域设置影响:
if (Regex.IsMatch(name, @"^[a-z]+$", RegexOptions.CultureInvariant) && name.Length <=7)
快速测试步骤
- 在
name = nameHolder.text.Trim();后添加日志,对比原始文本和Trim后内容:Debug.Log($"原始文本: '{nameHolder.text}' | Trim后: '{name}'"); - 临时将文本强制转小写,验证是否能通过检测(若业务允许自动转小写):
name = nameHolder.text.Trim().ToLower();
内容的提问来源于stack exchange,提问作者some person
相关产品推荐
相关产品推荐

