所以我要说我有这个字符串
Testing CAP counter and LENGTH li mi TER
我有这个公式
=COUNTA(REGEXEXTRACT(D2; REPT(".* ([А-ЯA-Z]{3,})";COUNTA(SPLIT(REGEXREPLACE(D2;"([А-ЯA-Z]{3,})";"$");"$"))-1)))
预期的行为是,它将计算所有大写字母,但是3个或更多字母。
但是,例如,它不计算我的字符串中的“TER”。此外,如果在字符串中我写这样的单词“cOUNTER”,它将计算它。
就第二个问题而言,我理解我错过了某种方式:
SPLIT(D2; " ")
在那里的某个地方,但是当我尝试将其插入时,我会一直遇到不同的错误。
关于“TER”的第一个问题,我不知道。有人能帮我解决这些问题吗?
在我的地区,我们使用;而不是在公式中
如果您只需使用ASCII字符串,则可以使用简单的字符串
=LEN(REGEXREPLACE(REGEXREPLACE(D2,"\b[[:upper:]]{3,}\b", "§"),"[^§]+",""))
其中\b[[:upper:]]{3,}\b
匹配单词边界之间的3+大写字母单词。但是,您不能依赖不支持Unicode的\b
。要启用Unicode字母支持,您需要使用(^|[[:punct:][:space:]])[A-ZА-ЯЁ]{3,}($|[[:punct:][:space:]])
,但在此之前,为了确保找到所有连续匹配,您需要将所有现有分隔符加倍,即标点符号或空格字符:
=LEN(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(A17, "[[:punct:][:space:]]","$0$0"),"(^|[[:punct:][:space:]])[A-ZА-ЯЁ]{3,}($|[[:punct:][:space:]])", "§"),"[^§]+",""))
我使用§
作为临时拆分字符,但您可以使用$
(正如您现在所做的那样)或任何其他不太可能出现在您的数据中的字符。
细节
REGEXREPLACE(A17, "[[:punct:][:space:]]","$0$0")
- 匹配任何标点符号或空白字符(与[[:punct:][:space:]]
)并将其加倍(使用$0$0
,其中$0
返回整个匹配值)REGEXREPLACE(...,"(^|[[:punct:][:space:]])[A-ZА-ЯЁ]{3,}($|[[:punct:][:space:]])", "§"))
- 取代§
所有的情况
(^|[[:punct:][:space:]])
- 字符串或任何标点符号或空格字符的开头
[A-ZА-ЯЁ]{3,}
- 3个或更多大写ASCII或俄语大写字母
($|[[:punct:][:space:]])
- 字符串结尾或任何标点符号或空白字符REGEXREPLACE(...,"[^§]+","")
- 移除除§
之外的一个或多个字符的所有块=LEN(...)
- 获取结果字符串的长度。