Как найти символ с конца строки

  • Обычная составная формула
  • Формулы массива для поиска символа с конца строки
    • С помощью МАКС
    • С помощью ПОИСКПОЗ

Как найти первый символ с конца строки?

Поиск позиции последнего вхождения значения внутри ячейки Excel – довольно сложная задача.

Тем не менее, иногда ее необходимо решить, например, чтобы удалить или заменить это вхождение.

Так а в чем же проблема?

Все дело в том, что функции поиска позиции ПОИСК и НАЙТИ ищут только с начала ячейки, и у них нет параметра переключения на поиск с конца.

Процедура Найти и Заменить также не подойдет. Она ищет не с конца строки, а просто находит (и заменяет) все вхождения.

Ниже я покажу пару способов, как осуществить поиск с конца строки.

Обычная составная формула

Формула, похожая на ту, что ниже, рассматривается подробно в статье о том, как удалить последнее слово в ячейке Excel. Поиск пробела с конца строки как раз является необходимым в этом случае.

Формула ниже ищет пробел с конца ячейки A1:

=ПОИСК(ЮНИСИМВ(23456);ПОДСТАВИТЬ(A1;" ";ЮНИСИМВ(23456);ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1;" ";""))))

Как она работает:

  • Фрагмент, обозначенный красным цветом, вычисляет количество пробелов в ячейке. Подробнее можно почитать в описании функции ПОДСТАВИТЬ.
  • Это количество является аргументом еще одной подстановки, где заменяется лишь последний пробел (выделено жирным)
  • Вместо пробела в его последнюю позицию вставляется достаточно редкий символ. В данном случае это иероглиф, который создается функцией СИМВОЛ. Но можно и прописать символ вручную. В формуле ниже это обратная косая черта:
=ПОИСК("";ПОДСТАВИТЬ(A1;" ";"";ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1;" ";""))))
  • Функция ПОИСК находит позицию этого символа. Поскольку он встречается в строке всего один раз и стоит на месте последнего пробела, это и позволяет нам сказать, что поиск произведен справа налево.

Если вам необходимо найти с конца строки какой-то другой символ или текстовый фрагмент, замените пробелы в этой формуле на него.

поиск с конца строки - формула
Примеры использования составной формулы для поиска с конца строки

Формулы массива для поиска символа с конца строки

Поиск слева направо с помощью функции ПОДСТАВИТЬ, описанный выше, имеет пару недостатков.

Первый – регистрозависимость этой функции, но это легко учесть, обернув нужные фрагменты функциями изменения регистра.

А второй уже серьезнее – формула не очень универсальна, т.к. использует замену на символ, который может оказаться в строке, и тогда она выдаст неверное значение.

От обоих проблем избавят формулы массива. Они обе создают массивы значений, внутри которых функция выбирает последнее.

С помощью МАКС

Формула ниже находит позицию символа “а” в любом регистре.

={МАКС((ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)="а")*СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1))))}
ВАЖНО:
Это формула массива!
Она вводится без фигурных скобок.
Но не клавишей Enter а сочетанием: 
Ctrl+Shift+Enter
После этого фигурные скобки появятся сами.
Если ввести формулу обычным способом, она не сработает.

Механика ее работы пошагово:

  1. Функция ДЛСТР измеряет длину ячейки в символах
  2. ДВССЫЛ создает из текстового представления длины ссылку на диапазон строк с 1 по строку, равную этой длине
  3. Функция СТРОКА возвращает массив чисел, соответствующих этим длинам, соответственно, {1;2;3;…”длина строки”}
  4. Функция ПСТР, обрабатывая этот массив, возвращает для каждого числа символ, стоящий на этой позиции в строке
  5. Текстовое сравнение с символом “а” возвращает булевый массив (значения ИСТИНА или ЛОЖЬ)
  6. Этот массив умножается на повторно созданный массив чисел (пункты 1:3). ЛОЖЬ эквивалентна нулю, а ИСТИНА – единице, поэтому для всех символов, не равных “а”, в результирующем числовом массиве будут нули, а для равных – их позиции
  7. Функция МАКС возвращает наибольшее число в этом массиве.

С помощью ПОИСКПОЗ

Чуть более хитрая механика делает формулу короче, вместе с тем существенно быстрее, а задействует функцию ПОИСКПОЗ:

{=ПОИСКПОЗ(2;1/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)="а");1)}
ВАЖНО:
Это формула массива!
Она вводится без фигурных скобок.
Но не клавишей Enter а сочетанием: 
Ctrl+Shift+Enter
После этого фигурные скобки появятся сами.
Если ввести формулу обычным способом, она не сработает.

Здесь алгоритм такой:

  1. Как и в предыдущем варианте, с помощью тех же функций ДЛСТР, СТРОКА, ДВССЫЛ, ПСТР и текстового сравнения создается булевый массив;
  2. Но на этом этапе единица делится на него. ЛОЖЬ эквивалентна нулю и выдается ошибка деления на ноль. ИСТИНА возвращает единицу.
  3. Функция ПОИСКПОЗ с последним параметром “1” при поиске 2 (на месте 2 может быть любое число больше 1) возвращает позицию последнего наибольшего числа, меньшее, чем 2. Т.е. последней единицы, которой и соответствует последний найденный в строке символ.

Смотрите также по теме:

Формулы массива в Excel

Удалить последнее слово в ячейке

Найти и заменить первую букву в ячейке на заглавную


Предыдущая статья о формулах массива:

Учимся формулам массива 3/4:

Извлечь текст до первой цифры в ячейке

Часто сталкиваетесь с этой или похожими задачами при работе в Excel?
Сотни инструментов надстройки для Excel !SEMTools помогут вам упростить их решение и сэкономят ваше время!

0 / 0 / 0

Регистрация: 08.02.2013

Сообщений: 24

1

Поиск символа с конца строки

15.10.2013, 00:15. Показов 13844. Ответов 10


Студворк — интернет-сервис помощи студентам

Здравствуйте..

Как найти символ с конца строки ?

Например : предложение – простотестовый вариант.

И нужно определить позицию 2-ого пробела с конца…
(именно с конца, т.к. предложение могут быть большими и нужно с конца.)



0



Неэпический

17811 / 10583 / 2043

Регистрация: 27.09.2012

Сообщений: 26,622

Записей в блоге: 1

15.10.2013, 00:22

2

Ну во-первых, какие строки?
А во-вторых, в чем проблема поиска с конца?



0



267 / 255 / 27

Регистрация: 27.09.2013

Сообщений: 876

Записей в блоге: 1

15.10.2013, 00:23

3

SupermaNO, делаете цикл от длины строки до 0, и считаете встречающиеся символы == ‘ ‘ (первое, что пришло в голову)



0



0 / 0 / 0

Регистрация: 08.02.2013

Сообщений: 24

15.10.2013, 00:33

 [ТС]

4

Цитата
Сообщение от Croessmah
Посмотреть сообщение

Ну во-первых, какие строки?
А во-вторых, в чем проблема поиска с конца?

1. Типа string
2. name_per.find(‘ ‘); ищет от начала.

На счёт варианта Folko – могли бы вы подсказать как преобразовать string в массив char[] ?



0



267 / 255 / 27

Регистрация: 27.09.2013

Сообщений: 876

Записей в блоге: 1

15.10.2013, 00:38

5

SupermaNO, а зачем преобразовывать? Со строками работать точно также как с массивами. s[4] укажет на 5 символ в строке



0



0 / 0 / 0

Регистрация: 08.02.2013

Сообщений: 24

15.10.2013, 01:00

 [ТС]

6

name_per.size();
name_per.lenght();

считывает кол-во до пробела…



0



Folko

267 / 255 / 27

Регистрация: 27.09.2013

Сообщений: 876

Записей в блоге: 1

15.10.2013, 01:12

7

SupermaNO, что то я не понял проблемы?

C++ (Qt)
1
2
3
4
5
6
7
8
9
QString str = "Текст строка пробелы и гуфы";
int t = str.toLength()-1;
int probelov = 0;
while (t >=0 && probelov < 2)
{
      if (str[t] == ' ') probelov++;
      t--;
}
cout << "Второй проблел" << t;

И еще вставить проверку, если вдруг в строке будет меньше пробелов
Вроде так



0



0 / 0 / 0

Регистрация: 08.02.2013

Сообщений: 24

15.10.2013, 01:22

 [ТС]

8

QString нужно без использования данного типа переменной.
(string,char)

Добавлено через 4 минуты
Пишу консольное приложение Win32 – C++ MVS 2010.



0



267 / 255 / 27

Регистрация: 27.09.2013

Сообщений: 876

Записей в блоге: 1

15.10.2013, 01:23

9

SupermaNO, QString – строковый тип в Qt. Работа со String происходит идентичным образом, только получение длины строки будет немного иным (по моему просто length или Length). Замените в моем примере QString на String



0



0 / 0 / 0

Регистрация: 08.02.2013

Сообщений: 24

15.10.2013, 20:42

 [ТС]

10

Цитата
Сообщение от SupermaNO
Посмотреть сообщение

name_per.size();
name_per.lenght();

считывает кол-во до пробела…

Добавлено через 19 часов 17 минут
проблема ещё актуальна…



0



AlexeyMo

0 / 0 / 0

Регистрация: 13.01.2019

Сообщений: 3

23.01.2019, 08:43

11

Шесть лет спустя, но ссылка всё ещё первая в гугле, напишу свой вариант решения проблемы.

C++
1
2
3
4
5
string line = "tag1.tag2.tag4"
 
reverse(line.begin(), line.end());
int n = line.find('.');
reverse(line.begin(), line.end());

n = 9



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

23.01.2019, 08:43

11

Think about what you’re asking for:

  • A number which is always at the end of the string
  • A number which immediately follows a - character.
  • Something which follows a - character, which is not, itself, a - character.

These are all different ways of phrasing your question, getting less-specific as we go. Any of these would probably suit your needs, but I’ll cover each case to show how it does what is does.

These can be spelled in a number of different ways. Depending on the regex flavour you’re using, some of these ways may need to be escaped differently (for example, X+ vs X+ vs XX*), and not all may be supported in all flavours.

“A number which is always at the end of the string”:

([0-9][0-9]*)$
([0-9]+)$
(d+)$

Regular expression patterns are greedy, that is: they match as much as they can. So in the first case, asking for at least one number at the end of the string (“at the end of the string” specified as $), will end up giving you the entire number at the end of the string.

“A number which immediately follows a - character”:

-([0-9][0-9]*)
-([0-9]+)
-(d+)

Here, rather than specifying the “end of the string”, we specify that it should follow a - character. Because [0-9] will not match a - character itself, we don’t need to do anything else to avoid capturing -.

“Something which follows a – character, which is not, itself, a – character”:

-([^-][^-]*)
-([^-]+)

This one’s a bit trickier: Rather than specifying we want a number, we just specify that we don’t want a dash, by specifying a negative match ([^X]). Sometimes it can be tricky to match a - character in a character class, but the rule is “always specify - at the beginning“, and you should be fine.

Функция slice может принимать и отрицательное значение, тогда отчет будет идти с конца

var text = '134t8t103tu104ti13-э';
var lastChar = text.slice(-1);

Ну либо в ручную узнавайте длину строки

var text = "1234135134uhkr9u94mэ";
var lastChar = text[text.length -1];

ответ дан 4 апр 2016 в 17:28

ThisMan's user avatar

0

    var stringValue = "dfsdfэ";
    var letter = stringValue.split('').splice(-1).join('');
    alert(letter);

ответ дан 4 апр 2016 в 17:30

Jean-Claude's user avatar

Jean-ClaudeJean-Claude

5,7902 золотых знака18 серебряных знаков42 бронзовых знака

Как найти первый символ в конце строки?

Найти позицию последнего вхождения значения в ячейке Excel — довольно сложная задача.

Однако иногда это необходимо исправить, например, чтобы удалить или заменить это вхождение.

Так в чем проблема?

Дело в том, что функции поиска местоположения SEARCH и FIND выполняют поиск только с начала ячейки и не имеют возможности перейти к поиску с конца.

Процедура «Найти и заменить» также не будет работать. Он не ищет с конца строки, он просто находит (и заменяет) все вхождения.

Ниже я покажу вам несколько способов поиска с конца строки.

Обычная составная формула

Формула, аналогичная приведенной ниже, подробно описана в статье Как удалить последнее слово в ячейке Excel. В этом случае необходимо искать пробел с конца строки.

Следующая формула ищет пробел от конца ячейки A1:

= ПОИСК (UNISIMV (23456); ПОДСТАВИТЬ (A1; «»; UNISIMV (23456); DLSTR (A1) -LSTR (ПОДСТАВИТЬ (A1;» «;»»))))

Как это работает:

  • В разделе, выделенном красным, рассчитывается количество пробелов в ячейке. Более подробную информацию можно найти в описании функции ЗАМЕНИТЬ.
  • Этот номер является аргументом в пользу другой замены, где заменяется только последний пробел (выделенный жирным шрифтом)
  • Вместо пробела на его последней позиции вставляется довольно редкий символ. В данном случае это иероглиф, созданный функцией SYMBOL. Но вы также можете зарегистрировать символ вручную. В приведенной ниже формуле это обратная косая черта:

= ПОИСК («»; ПОДСТАВИТЬ (A1; «»; «»; DLSTR (A1) -LSTR (ПОДСТАВИТЬ (A1;» «;»»))))

  • Функция ПОИСК находит позицию этого символа. Поскольку он встречается только один раз в строке и находится на месте последнего пробела, это позволяет нам сказать, что поиск выполнялся справа налево.

Если вам нужно найти другие символы или фрагменты текста с конца строки, замените им пробелы в этой формуле.

поиск в конце строки - формула Примеры использования составной формулы для поиска с конца строки

Формулы массива для поиска символа с конца строки

Поиск слева направо с помощью описанной выше функции REPLACE имеет несколько недостатков.

Первый — это регистрозависимый регистр этой функции, но это легко учесть, заключив необходимые фрагменты в функции изменения регистра.

А второе уже посерьезнее: формула не очень универсальна, т.к использует подстановку символа, который может появиться в строке и, таким образом, вернет неверное значение.

Формулы массива избавляют от обеих этих проблем. Оба создают массивы значений, в которых функция выбирает последнее.

С помощью МАКС

В любом случае следующая формула находит положение символа «а.

= {MAX ((MID (A1; LINE (INDIRECT («1:» & DLSTR (A1)))); 1) = «a») * LINE (INDIRECT («1:» & DLSTR (A1)))))) ВАЖНО: Это формула массива! Вы входите без фигурных скобок. Но не клавишей Enter, а комбинацией: Ctrl + Shift + Enter После этого фигурные скобки появятся сами собой. Если вы введете формулу обычным способом, она не сработает.

Механика его работы пошаговая:

  1. Функция DLSTR измеряет длину ячейки в символах
  2. INDIRECT создает из текстового представления длины ссылку на диапазон строк от 1 до строки, равной этой длине
  3. Функция СТРОКА возвращает массив чисел, соответствующих этим длинам, соответственно, {1; 2; 3;… «длина строки»}
  4. Функция MID, обрабатывая этот массив, возвращает символ в этой позиции в строке для каждого числа
  5. Текстовое сравнение с символом «a» возвращает логический массив (значения TRUE или FALSE)
  6. Эта матрица умножается на воссозданную матрицу чисел (точки 1: 3). FALSE эквивалентно нулю, а TRUE эквивалентно единице, поэтому для всех символов, которые не равны «a», результирующий числовой массив будет содержать нули, а для равных — их позиции
  7. Функция MAX возвращает наибольшее число в этом массиве.

С помощью ПОИСКПОЗ

Чуть более умный механизм делает формулу короче, но в то же время намного быстрее и использует функцию СРАВНЕНИЕ:

{= SEARCH (2; 1 / (MID (A1; LINE (INDIRECT («1:» & DLSTR (A1)))); 1) = «a»); 1)} ВАЖНО: это формула массива! Вы входите без фигурных скобок. Но не клавишей Enter, а комбинацией: Ctrl + Shift + Enter После этого фигурные скобки появятся сами собой. Если вы введете формулу обычным способом, она не сработает.

Вот алгоритм:

  1. Как и в предыдущей версии, с использованием тех же функций DLSTR, STRING, INDIRECT, MID и сравнения текста создается логический массив;
  2. Но на данном этапе на него делится единство. FALSE эквивалентно нулю, и выводится ошибка деления на ноль. ИСТИНА возвращает единицу.
  3. Функция ПОИСКПОЗ с последним параметром «1» при поиске 2 (на месте 2 может быть любое число больше 1) возвращает позицию последнего наибольшего числа меньше 2) То есть последнюю единицу, которая соответствует последней в строке найден символ.

Добавить комментарий