Как найти последний пробел в тексте

Существует ли какой-нибудь простой способ с помощью формул найти последний пробел?  

  На данный момент я пользуюсь формулами вида =ПОИСК(» «;строка;длина_строки-5), что явно не очень удобно. Во-первых, поскольку поиск ведётся в прямом направлении, нет никакой гарантии, что найденный пробел будет последним. Во-вторых, в выбранный интервал (в данном случае, 5 символов) пробел может и не попасть, если слова длинные, поэтому приходится задавать кучу условий на длину строки, все увеличивая и увеличивая интервал поиска.  

  Так что если кто-нибудь знает, как с помощью формул провести поиск с конца или перевернуть символы строки в обратном порядке, буду очень благодарен.

Чтобы определить положение последнего пробела в строке надо с помощью формулы массива (для старых версий, начиная с Excel 2007 , вводится через CTRL+SHIFT+ENTER, новые Excel, с 2019 этого не требуют) составить формулу содержащую индекс каждого пробела в строке или ноль для других символов, а затем выбрать элемент с наибольшим значением.

Чтобы выбрать наибольший элемент в массиве значений подходит функция

=НАИБОЛЬШИЙ(массив; номер элемента)

Для самого большого значения (последний пробел) номер элемента равен 1

Для наибольшего значения меньше самого большого (предпоследний пробел) номер элемента равен 2 и так далее.

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

=СТРОКА(ссылка на массив строк)

Массив строк можно задать статически для строк, имеющих одинаковую длину (элементы с индексами от 1 до 255):

=СТРОКА($1:$255)

или динамически (если строка в ячейке A1, элементы с индексами от 1 до последнего):

=СТРОКА( ДВССЫЛ( «1:»&ДЛСТР( A1 ))

Получаем такие формулы определяющие индекс последнего пробела строки

Статическая (рассматривает 255 элементов массива)

=НАИБОЛЬШИЙ( ЕСЛИ( ПСТР(A1; СТРОКА( $1:$255); 1)=» «; СТРОКА( $1:$255); 0); 1)

Динамическая (рассматривает с первого до последнего символа строки)

=НАИБОЛЬШИЙ( ЕСЛИ( ПСТР(A1; СТРОКА( ДВССЫЛ( «1:»&ДЛСТР(A1))); 1)=» «; СТРОКА(

ДВССЫЛ( «1:»&ДЛСТР(A1))); 0); 1)

Пример использования

Индекс предпоследнего пробела строки вычисляется формулами:

Статическая (рассматривает 255 элементов массива)

=НАИБОЛЬШИЙ( ЕСЛИ( ПСТР(A1; СТРОКА( $1:$255); 1)=» «; СТРОКА( $1:$255); 0); 2)

Динамическая (рассматривает с первого до последнего символа строки)

=НАИБОЛЬШИЙ( ЕСЛИ( ПСТР(A1; СТРОКА( ДВССЫЛ( «1:»&ДЛСТР(A1))); 1)=» «; СТРОКА( ДВССЫЛ( «1:»&ДЛСТР(A1))); 0); 2)

При копировании формул в свой проект адрес ячейки исходной строки (A1) надо заменить на адрес ячейки своего проекта.

I’m searching for a regex to find the last occurence of a space in my text but I’don’t want to find a space from in a HTML tag.

"This is a string with <strong>some</strong> html in it"

The space that the regexp should find is the one between in and it. That regex is not so difficult. The same regex would also work here:

"This is a string with <strong>some</strong> html in <a href="">the end</a>"

The space would be now in the HTML between the and end (ok!)

But when my string is:

"This is a string with <strong>some</strong> html in the <a href="">end</a>"

Then the space should be between the and <a and not between <a and href="">end<a>.

Anyone some idea?

asked Aug 23, 2012 at 13:45

Jonas De Smet's user avatar

1

Updating this answer since more information about requirements came to light.

A combination of strip_tags(), strrpos(), substr() functions will do the trick. Use the strip_tags() function to clean out the HTML first. You’ll then be left with the text and can explode it to find the last word, and then use strrpos() to find the position of that word in the original text.

$stringToken = explode( ' ', strip_tags( $str ) );
// Find the second-to-last word in the string.
$word = $stringToken[ count( $string ) - 2 ];

// Use $word to find its position within the original HTML-encoded string.
$wordPosition = strrpos( $str, $word );

if( $wordPosition !== false )
{
    $finalSpace = strpos( $str, ' ', $wordPosition );
    $lastSpacePrefix = substr( $str, 0, $finalSpace );
    $lastSpaceSuffix = substr( $str, $finalSpace + 1 );
    $newStr = sprintf( "%s%s%s", $lastSpacePrefix, $finalSpaceSub, $lastSpaceSuffix );
}

answered Aug 23, 2012 at 13:58

Thomas's user avatar

ThomasThomas

1,4021 gold badge11 silver badges14 bronze badges

3

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

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

Поиск позиции последнего вхождения значения внутри ячейки 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 помогут вам упростить их решение и сэкономят ваше время!

 
Гарри Шалфеевичь
 
(2005-09-29 17:19)
[0]

…или последний пробел в строке ДО опеделенной позиции?

Допустим есть строка :
«Разрешается использование тегов форматирования текста: а для выделения текста программ»
Как мне найти пробел между словами «текста» и  «программ» не знаная об эих словах?
То есть…  
Есть ричедит в который грузится тестовой файл. В результате в ричедите оказываетя порядка 100 — 150 строк разной длины. КАК найти пробелы в строках ДО 120 символа? Именно последний пробел перед 120 символом.

Вобщем мне надо сделать прогу которая будет выравнивать текст, а точнее строки в тексте по попределенной длине. Нельзя же обрезать полслова и оставшуюся часть слова перенести на следуюшую строку, вот поэтому мне и надо найти пробел перед словом которое должно оказаться последним в строке, чтобы с пробела и перенести оставшуюся часть строки на новую строку.

Вобщем я фигово излогаю, но как внятнее я не знаю.
Помогите плийз если не трудно…


 
umbra ©
 
(2005-09-29 17:31)
[1]


function FindLastSpace(src: string): integer;
begin
src := LeftStr(src, 120);
src := ReverseStr(src);
Result := Pos(" ", src);
end;


 
Smithson
 
(2005-09-29 17:41)
[2]

[code]
for I := Length(S) downto 1 do
 if S[I] — » » then // Нашли!
[/code]


 
han_malign ©
 
(2005-09-29 18:28)
[3]

Result:=0;
len:= Length(str);
if(len > limit)then begin
   Result:=limit;
   while((Result > 0) and (str[Result] <> " ")) dec(Result);
end;


 
Гарри Шалфеевичь
 
(2005-09-29 18:44)
[4]

Спасибо всем большое!!!!
И в праду форум МАСТЕРОВ )))


 
Fay ©
 
(2005-09-29 18:51)
[5]

2 umbra ©   (29.09.05 17:31) [1]
Зачем такие сложности?!


 
begin…end ©
 
(2005-09-29 18:51)
[6]

> Как найти ПОСЛЕДНИЙ пробел в строке?

См. функции AnsiStrRScan или LastDelimiter из модуля SysUtils.


 
umbra ©
 
(2005-09-29 18:59)
[7]


> Fay ©   (29.09.05 18:51) [5]
> Зачем такие сложности?!

Надо ж эти функции как нибудь использовать! Да и наглядней получается.


> begin…end

А у меня в делфи AnsiStrRScan нет


 
Fay ©
 
(2005-09-29 19:15)
[8]

2 umbra ©   (29.09.05 18:59) [7]
А for есть? 8)


 
umbra ©
 
(2005-09-29 19:21)
[9]

2 Fay © (29.09.05 19:15) [8]

Ну надо ж уважать труд создателей делфи! они трудились, функции писали:))


 
begin…end ©
 
(2005-09-29 19:24)
[10]

> umbra ©   (29.09.05 18:59) [7]

А у меня в Delphi AnsiStrRScan есть.


 
Fay ©
 
(2005-09-29 19:35)
[11]

2 begin…end ©   (29.09.05 19:24) [10]

>> А у меня в Delphi AnsiStrRScan есть.
У меня, как выяснилось, тоже. (D7)
Посмотрел. Гуано редкое.


 
begin…end ©
 
(2005-09-29 19:38)
[12]

> Fay ©   (29.09.05 19:35) [11]
> Гуано редкое.

Надеюсь, я в этом не виноват?


 
Fay ©
 
(2005-09-29 19:40)
[13]

2 begin…end ©   (29.09.05 19:38) [12]
Сторона обвинения пока не располагает убедительными доказательствами 8)


 
umbra ©
 
(2005-09-29 19:42)
[14]


> Fay ©  

Как оказалось, и у меня она есть тоже. Если присмотреться к модулю StrUtils, то можно рассмотреть


 
umbra ©
 
(2005-09-29 19:44)
[15]


> StrUtils

Все, пора домой! SysUtils


Понравилась статья? Поделить с друзьями:
  • Как найти или заработать много денег
  • Как найти производительность время работу 4 класс
  • Как найти значение по модулю питон
  • Открыт в другой программе как это найти
  • Как найти самую большую дробь