Google листы, считая слова, которые являются заглавными и определенной длины - PullRequest
0 голосов
/ 03 сентября 2018

Допустим, у меня есть эта строка

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" я понятия не имею. Сможет ли кто-нибудь помочь мне с этими проблемами?

В моем регионе мы используем; вместо, в формулах

1 Ответ

0 голосов
/ 03 сентября 2018

Если вам нужно было работать только со строками ASCII, вы можете использовать простое

=LEN(REGEXREPLACE(REGEXREPLACE(D2,"\b[[:upper:]]{3,}\b", "§"),"[^§]+",""))

, где \b[[:upper:]]{3,}\b соответствует 3+ заглавным буквам между границами слов. Однако вы не можете полагаться на \b, который не поддерживает Unicode. Чтобы включить поддержку букв 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(...) - получает длину полученной строки.
...