“较低”不适用于包含异国字符的字符串

时间:2018-05-30 07:44:23

标签: string autohotkey

我有一个代码部分,用于检查字符串是否全部小写。如果是,它会给我第一个和最后一个字符作为缩写。如果没有,它会将大写部分作为缩写。

if Hotstring is lower
    {
    ShortString := SubStr(Hotstring,1,1) . SubStr(Hotstring,0)
    }else{
    ShortString := RegExReplace(Hotstring, "[a-záéiíóöőúüű ]", "")
    StringLower,ShortString, ShortString
    }   

问题: 如果我的输入字符串包含中欧字符,则字符串无法正确识别为小写字母。

2 个答案:

答案 0 :(得分:2)

  1. 遗留语法的分离,已在AutoHotkey v2中消除,几乎总能提供更好的解决方案。

  2. 了解 POSIX命名集 (*UCP) here

  3. 以下测试工作:

    If RegExMatch(Hotstring, "(*UCP)^[[:lower:] ]+$")   
        ; or just "(*UCP)^[[:lower:]]+$" if you want to stick with the exact definition of the "lower" type
        ShortString := SubStr(Hotstring, 1, 1) SubStr(Hotstring, 0)
    Else
        ShortString := Format("{:L}", RegExReplace(Hotstring, "(*UCP)[[:lower:] ]+"))
    

    功能相同但更简洁的替代方案:

    ShortString := Hotstring ~= "(*UCP)^[\p{Ll} ]+$" 
                   ? SubStr(Hotstring, 1, 1) SubStr(Hotstring, 0)
                   : Format("{:L}", RegExReplace(Hotstring, "(*UCP)[\p{Ll} ]+"))
    

答案 1 :(得分:0)

我为自己创建了一个解决方法,首先将特殊字母转换为一个简单的lcap字母 - 仅查看完整字符串是否为lcap。
在此检查之后,我继续使用原始字符串,而不是转换 testString:= RegExReplace(Hotstring,“[áéiíóöőúüű]”,“a”)

testString := RegExReplace(Hotstring, "[áéiíóöőúüű]", "a")
        if testString is lower
        {
        ShortString := SubStr(Hotstring,1,1) . SubStr(Hotstring,0)
        }else{
        ShortString := RegExReplace(Hotstring, "[a-záéiíóöőúüű ]", "")
        StringLower,ShortString, ShortString
        }

如果你们中的一些人知道一个简单的开关/选项,允许将这些字符正确地内置识别为高/低,请发布。
在那之前,请使用我的解决方法。