You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

快速测试步骤

  1. 在name = nameHolder.text.Trim();后添加日志,对比原始文本和Trim后内容:
    Debug.Log($"原始文本: '{nameHolder.text}' | Trim后: '{name}'");
    
  2. 临时将文本强制转小写,验证是否能通过检测(若业务允许自动转小写):
    name = nameHolder.text.Trim().ToLower();
    

内容的提问来源于stack exchange,提问作者some person

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:12:57