Excel: последнее совпадение символа и строки в строке
Существует ли эффективный способ определить последнее совпадение символа / строки в строке с помощью базовых функций? I.e. не последний символ / строка строки, а позиция последнего вхождения character/string’s в строке. Search и find оба работают left-to-right, поэтому я не могу придумать, как применить их без длинного рекурсивного алгоритма. И это решение сейчас кажется устаревшим.
12 ответов
Я должен заменить последнее совпадение строки (например, слово foo) в документе HTML. Проблема в том, что структура документа HTML всегда случайна. Я пытаюсь сделать это с помощью preg_replace, но пока я знаю, как заменить только первый матч, но не последний. Спасибо.
Думаю, я понимаю, что ты имеешь в виду. Допустим, например, вам нужен самый правый \ в следующей строке (которая хранится в ячейке A1):
Чтобы получить позицию последнего \, вы должны использовать эту формулу:
Это говорит нам, что самое правое \ находится в символе 24. Он делает это, ища «@» и заменяя самую последнюю «\» на «@». Он определяет последний с помощью
В этом случае подстрока просто»\», которая имеет длину 1, поэтому вы можете оставить деление в конце и просто использовать:
Теперь мы можем использовать это, чтобы получить путь к папке:
Однако вот альтернативная версия получения всего справа от последнего экземпляра конкретного символа. Таким образом, используя наш же пример, это также вернет имя файла:
Как насчет создания пользовательской функции и использования ее в формуле? VBA имеет встроенную функцию InStrRev , которая делает именно то , что вы ищете.
И ваша функция будет выглядеть следующим образом (при условии, что исходная строка находится в B1):
тигераватар и Жан-Франсуа Корбетт предложили использовать эту формулу для генерации строки справа от последнего вхождения символа «\»
Если символ, используемый в качестве разделителя, — пробел,»», то формулу необходимо изменить на:
С новыми версиями excel появляются новые функции и, следовательно, новые методы. Хотя он воспроизводится в более старых версиях (но я не видел его раньше), когда у вас есть Excel O365, вы можете использовать его:
Это также может быть использовано для извлечения последней позиции (перекрывающихся) подстрок:
Хотя это и позволяет нам больше не использовать произвольный символ замены, и это позволяет перекрывать паттерны, «downside»-это использование массива.
Примечание: Вы можете заставить то же самое поведение в более старых версиях Excel через любой из них
Вводится через Ctrl Shift Enter или с помощью встроенного INDEX , чтобы избавиться от неявного пересечения:
Я пытаюсь заменить последнее слово строки, если оно имеет длину 2 символа, используя regex. Я использовал [a-zA-Z]$ , но он находит последние 2 символа строки. Я не хочу заменять последнее слово, если оно не содержит ровно 2 символа, как я могу это сделать?
Вы можете использовать эту функцию, которую я создал, чтобы найти последний экземпляр строки в строке.
Конечно, принятый Excel formula работает, но его слишком сложно читать и использовать. В какой-то момент вам придется разбиться на более мелкие куски, чтобы его можно было обслуживать. Моя функция ниже читаема, но это не имеет значения, потому что вы вызываете ее в формуле, используя именованные параметры. Это упрощает его использование.
Это возвращает то, что остается (здесь Filename.ext ) после последнего экземпляра любого выбранного символа (здесь \ ), который иногда является целью в любом случае, и облегчает поиск позиции последнего такого символа с помощью короткой формулы, такой как:
Я немного опоздал на вечеринку, но, может быть, это поможет. Ссылка в вопросе имела аналогичную формулу, но моя использует оператор IF(), чтобы избавиться от ошибок.
Если вы не боитесь Ctrl+Shift+Enter, вы можете довольно хорошо работать с формулой массива.
возвращает массив строк длиной 1, найденных в целевой строке, а затем возвращает пустые строки после достижения длины целевой строки:
сравнивает каждый элемент массива со строкой «.» и возвращает либо индекс символа в строке, либо FALSE:
Преимущества этой формулы в том, что она коротка, относительно проста для понимания и не требует каких — либо уникальных символов.
Недостатками являются обязательное использование Ctrl+Shift+Enter и ограничение длины строки. Это можно обойти с помощью варианта, показанного ниже, но этот вариант использует функцию OFFSET(), которая является изменчивой (читай: медленной) функцией.
Не уверен, какова скорость этой формулы по сравнению с другими.
В более новых версиях Excel (2013 и выше) flash заполнение может быть простым и быстрым решением см.: Использование Flash Заполнение Excel .
Очень поздно на вечеринку, но простое решение-использовать VBA для создания пользовательской функции.
Добавьте функцию в VBA в модуле WorkBook, Рабочий лист или VBA
в ячейке и строка, подлежащая поиску в ячейке B1, заполнит ячейку текстом trail, содержащим последний «/» из ячейки B1. Никаких ограничений по длине, никаких непонятных формул. Единственным недостатком, который я могу себе представить, является необходимость в рабочей книге с поддержкой макросов.
Любая пользовательская функция VBA может быть вызвана таким образом, чтобы вернуть значение в формулу ячейки, в том числе в качестве параметра встроенной функции Excel.
Если вы собираетесь активно использовать функцию, вам нужно будет проверить случай, когда символа нет в строке, тогда строка пуста и т. Д.
простой способ сделать это-перевернуть текст, а затем найти первую косую черту как обычно. Теперь вы можете получить длину полного текста минус это число.
Похожие вопросы:
Я играю с Ruby, чтобы сделать для меня некоторые версии файлов. У меня есть строка 2.0.0.65 . Я разделяю его, увеличиваю номер сборки (65 —> 66), а затем хочу заменить 65 на 66. Однако в этой.
Я хочу найти первое и последнее вхождение определенного символа внутри строки. В качестве примера рассмотрим строку с именем 2010-####-3434, и предположим, что искомый символ -#. Первое вхождение.
Я хочу найти индекс последнего вхождения символа в строку. Например, если моя строка google.com/program/test и я хочу найти букву / , я хочу, чтобы моя функция возвращала 18 , потому что это.
Я должен заменить последнее совпадение строки (например, слово foo) в документе HTML. Проблема в том, что структура документа HTML всегда случайна. Я пытаюсь сделать это с помощью preg_replace, но.
Кто-нибудь знает очень быстрый способ заменить последнее вхождение строки другой строкой в строке? Обратите внимание, что последнее вхождение строки может не быть последними символами в строке.
Я пытаюсь заменить последнее слово строки, если оно имеет длину 2 символа, используя regex. Я использовал [a-zA-Z]$ , но он находит последние 2 символа строки. Я не хочу заменять последнее слово.
Как я могу получить все совпадения в строке? Например, строка-это hhh (12) 5cb (jkl) jj или brt (11) < Я хочу получить 12 и jkl в первой строке и 11 во второй. Я пытался preg_match(/.*\((.*)\).*/.
В следующем вопросе обсуждается, как найти последнее совпадение в столбце: найдите последнее совпадение в столбце, используя встроенные функции в excel vba Мне нужен способ найти последний экземпляр.
В следующем вопросе обсуждается, как найти последнее совпадение в столбце найдите последнее совпадение в столбце, используя встроенные функции в excel Мне нужен способ найти последнее непустое.
[expert_bq id=»1570″]Если функция ЗАМЕНИТЬ меняет текст, указанный посимвольно вручную, то функция ПОДСТАВИТЬ автоматически находит вхождения указанной строки и меняет их. Если же вы хотите что-то уточнить, обращайтесь ко мне![/expert_bq] Пример 2. В столбце таблицы хранятся текстовые записи с наименованием и маркой товаров. Разделить имеющиеся строки на подстроки с наименованием и маркой соответственно и записать полученные значения в соответствующие столбцы таблицы.Работа со строками: от простого к сложному
Существует ли эффективный способ определить последнее совпадение символа / строки в строке с помощью базовых функций? I.e. не последний символ / строка строки, а позиция последнего вхождения character/string’s в строке. Search и find оба работают left-to-right, поэтому я не могу придумать, как применить их без длинного рекурсивного алгоритма. И это решение сейчас кажется устаревшим.