Как заменить символ в строке

от admin

Заменить символ в определенной позиции в строке в C#

В этом посте будет обсуждаться, как заменить символ в определенной позиции в строке в C#.

Строки неизменяемы в C#. Это означает, что мы не можем изменить их значения после их создания. Единственное возможное решение — создать новый строковый объект с замененным символом. Есть несколько способов заменить символ в определенной позиции в строке:

1. Использование StringBuilder() метод

Рекомендуемое решение — использовать StringBuilder класс для эффективной замены символа по определенному индексу в строке в C#, как показано ниже:

String.prototype.replace()

Метод replace() возвращает новую строку с одним, несколькими или всеми совпадениями pattern , замененными replacement . Шаблон может быть строкой или RegExp pattern а replacement может быть строкой или функцией, вызываемой для каждого совпадения. Если pattern является строкой, будет заменено только первое вхождение. Исходная строка остается неизменной. RegExp replacement pattern

Try it

Syntax

Parameters

Может быть строкой или объектом с методом Symbol.replace — типичным примером является регулярное выражение . Любое значение, не имеющее метода Symbol.replace , будет преобразовано в строку.

Может быть строкой или функцией.

  • Если это строка, она заменит подстроку, соответствующую pattern . Поддерживается ряд специальных шаблонов замены; см. раздел « Указание строки в качестве замены » ниже.
  • Если это функция, она будет вызываться при каждом совпадении, а ее возвращаемое значение используется в качестве замещающего текста. Аргументы, предоставляемые этой функции, описаны в разделе « Указание функции в качестве замены » ниже.

Return value

Новая строка,в которой одно,несколько или все совпадения шаблона заменены указанной заменой.

Description

Этот метод не изменяет строковое значение,вызванное им.Он возвращает новую строку.

Строковый шаблон будет заменен только один раз. Чтобы выполнить глобальный поиск и замену, используйте регулярное выражение с флагом g или вместо этого используйте replaceAll() .

Если pattern является объектом с методом Symbol.replace (включая объекты RegExp ), этот метод вызывается с целевой строкой и replacement в качестве аргументов. Его возвращаемое значение становится возвращаемым значением replace() . В этом случае поведение replace() полностью кодируется методом @@replace — например, любое упоминание «захвата групп» в описании ниже на самом деле является функциональностью, предоставляемой RegExp.prototype[@@replace] .

Если pattern представляет собой пустую строку, замена добавляется к началу строки.

Регулярное выражение с флагом g — единственный случай, когда replace() заменяет более одного раза. Для получения дополнительной информации о том, как свойства регулярных выражений (особенно липкий флаг) взаимодействуют с replace() , см. RegExp.prototype[@@replace]() .

Указание строки в качестве замены

Заменяющая строка может включать в себя следующие специальные заменяющие шаблоны:

Pattern Inserts
$$ Вставляет «$» .
$& Вставляет подходящую подложку.
$` Вставляет ту часть строки,которая предшествует подходящей подстроке.
$’ Вставляет ту часть строки,которая следует за соответствующей подстрокой.
$n Вставляет n -ю ( индексированную 1 ) группу захвата, где n — положительное целое число, меньшее 100.
$<Name> Вставляет именованную группу захвата, где Name — это имя группы.

$n и $<Name> доступны, только если аргумент pattern является объектом RegExp .Если pattern является строкой или соответствующая группа захвата отсутствует в регулярном выражении, шаблон будет заменен литералом. Если группа присутствует, но не соответствует (поскольку является частью дизъюнкции), она будет заменена пустой строкой.

Указание функции в качестве замены

В качестве второго параметра можно указать функцию.В этом случае функция будет вызвана после выполнения совпадения.Результат функции (возвращаемое значение)будет использован в качестве строки замены.

Примечание . Вышеупомянутые специальные шаблоны замены не применяются к строкам, возвращаемым функцией замены.

Функция имеет следующую сигнатуру:

Аргументы к функции следующие:

Соответствующая подстрока. (Соответствует $& выше.)

Строка n , найденная группой захвата (включая именованные группы захвата), при условии, что первым аргументом replace() является объект RegExp . (Соответствует $1 , $2 и т. д . выше.) Например, если pattern — /(\a+)(\b+)/ , то p1 соответствует \a+ , а p2 соответствует \b+ . Если группа является частью дизъюнкции (например, «abc».replace(/(a)|(b)/, replacer) ), несопоставленная альтернатива будет undefined .

Смещение совпадающей подстроки во всей проверяемой строке. Например, если вся строка была ‘abcd’ , а совпадающая подстрока была ‘bc’ , то этот аргумент будет равен 1 .

Вся струна исследуется.

Объект, ключами которого являются используемые имена групп, а значениями — совпавшие части ( undefined , если не совпали). Присутствует только в том случае, если pattern содержит хотя бы одну именованную группу захвата.

Точное количество аргументов зависит от того, является ли первый аргумент объектом RegExp , и если да, то сколько у него групп захвата.

Следующий пример устанавливает newString к ‘abc — 12345 — #$*%’ :

Функция будет вызываться несколько раз для каждого полного совпадения,подлежащего замене,если регулярное выражение в первом параметре является глобальным.

Examples

Определение регулярного выражения в replace()

В следующем примере регулярное выражение определяется в replace() и включает флаг игнорирования регистра.

Это журнал ‘Twas the night before Christmas. ‘ .

Примечание. Дополнительные сведения о регулярных выражениях см. в руководстве по регулярным выражениям.

Использование флагов global и ignoreCase в функции replace()

Глобальную замену можно выполнить только с помощью регулярного выражения. В следующем примере регулярное выражение включает глобальные флаги и флаги игнорирования регистра , что позволяет replace() заменять каждое вхождение слова ‘apples’ в строке на ‘oranges’ .

В этом бревне ‘oranges are round, and oranges are juicy’ .

Переключение слов в строке

Следующий скрипт переключает слова в строке. Для замещающего текста сценарий использует группы захвата и шаблоны замены $1 и $2 .

Это журнал ‘Smith, John’ .

Использование встроенной функции,которая модифицирует совпадающие символы.

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

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

Учитывая styleHyphenFormat(‘borderTop’) , это возвращает ‘border-top’ .

Поскольку мы хотим дополнительно преобразовать результат сопоставления до того, как будет произведена окончательная подстановка, мы должны использовать функцию. Это заставляет оценку соответствия до метода toLowerCase() . Если бы мы попытались сделать это, используя сопоставление без функции, toLowerCase() не возымел бы никакого эффекта.

Это связано с тем, что ‘$&’.toLowerCase() сначала будет оцениваться как строковый литерал (в результате получится тот же ‘$&’ ) перед использованием символов в качестве шаблона.

Замена степени Фаренгейта на степень,эквивалентную по Цельсию.

В следующем примере градус Фаренгейта заменяется на эквивалентный градус Цельсия. Степень Фаренгейта должна быть числом, заканчивающимся на «F» . Функция возвращает число Цельсия, заканчивающееся на «C» . Например, если «212F» число «212F» , функция вернет «100C» . Если число равно «0F» , функция возвращает «-17.77777777777778C» .

Тест регулярного выражения test любое число, оканчивающееся на F . Число градусов по Фаренгейту доступно для функции через ее второй параметр, p1 . Функция устанавливает число Цельсия на основе количества градусов Фаренгейта, переданного в строке функции f2c() . f2c() возвращает число Цельсия. Эта функция аппроксимирует флаг Perl s///e .

Изготовление заменителя рода

Предположим, мы хотим создать заменитель, который добавляет данные смещения к каждой совпавшей строке. Поскольку функция-заменитель уже получает параметр offset , это будет тривиально, если регулярное выражение известно статически.

Однако этот заменитель будет трудно обобщить, если мы хотим, чтобы он работал с любым шаблоном регулярных выражений. Заменитель является вариативным — количество аргументов, которые он получает, зависит от количества присутствующих групп захвата. Мы можем использовать остальные параметры , но это также будет собирать в массив offset , string и т.д. Тот факт, что groups могут передаваться или не передаваться в зависимости от идентичности регулярного выражения, также затруднит общее определение того, какой аргумент соответствует offset .

Приведенный выше пример addOffset не работает, когда регулярное выражение содержит именованную группу, потому что в этом случае args.at(-2) будет string , а не offset .

Вместо этого вам нужно извлечь последние несколько аргументов на основе типа, потому что groups — это объект, а string — это строка.

How to replace all occurrences of a character in string?

What is the effective way to replace all occurrences of a character with another character in std::string ?

17 Answers 17

std::string doesn’t contain such function but you could use stand-alone replace function from algorithm header.

The question is centered on character replacement, but, as I found this page very useful (especially Konrad’s remark), I’d like to share this more generalized implementation, which allows to deal with substrings as well:

EDIT:

The above can be implemented in a more suitable way, in case performance is of your concern, by returning nothing ( void ) and performing the changes "in-place"; that is, by directly modifying the string argument str , passed by reference instead of by value. This would avoid an extra costly copy of the original string by overwriting it.

Hope this will be helpful for some others.

Gauthier Boaglio's user avatar

I thought I’d toss in the boost solution as well:

Imagine a large binary blob where all 0x00 bytes shall be replaced by «\1\x30» and all 0x01 bytes by «\1\x31» because the transport protocol allows no \0-bytes.

  • the replacing and the to-replaced string have different lengths,
  • there are many occurences of the to-replaced string within the source string and
  • the source string is large,

the provided solutions cannot be applied (because they replace only single characters) or have a performance problem, because they would call string::replace several times which generates copies of the size of the blob over and over. (I do not know the boost solution, maybe it is OK from that perspective)

This one walks along all occurrences in the source string and builds the new string piece by piece once:

String.prototype.replace()

Метод replace() возвращает новую строку с некоторыми или всеми сопоставлениями с шаблоном, заменёнными на заменитель. Шаблон может быть строкой или регулярным выражением, а заменитель может быть строкой или функцией, вызываемой при каждом сопоставлении.

Синтаксис

Параметры

Объект регулярного выражения RegExp . Сопоставление заменяется возвращаемым значением второго параметра.

Строка, заменяемая на newSubStr . Обратите внимание, будет заменено только первое вхождение искомой строки.

Строка, заменяющая подстроку из первого параметра. Поддерживает несколько специальных шаблонов замены; смотрите ниже раздел Передача строки в качестве второго параметра.

Функция, вызываемая для создания новой подстроки (помещаемой вместо подстроки из первого параметра). Аргументы, передаваемые функции, описаны ниже в разделе Передача функции в качестве второго параметра.

Обратите внимание: аргумент flags не работает в ядре v8 (движок JavaScript в Chrome и NodeJs). Строка, задающая комбинацию флагов регулярного выражения. Параметр flags в методе String.prototype.replace() является нестандартным расширением. Вместо использования этого параметра используйте объект RegExp с соответствующими флагами. Значение этого параметра, если он используется, должно быть строкой, состоящей из одного или более следующих символов, следующим образом влияющих на обработку регулярного выражения:

сопоставление по нескольким строкам

«липкий» поиск, сопоставление начинается с текущей позиции в строке

Возвращаемое значение

Новая строка с некоторыми или всеми сопоставлениями шаблона, заменёнными на заменитель.

Описание

Этот метод не изменяет объект String , на котором он вызывается. Он просто возвращает новую строку.

Для выполнения глобального поиска и замены либо включите флаг g в регулярное выражение, либо, если первый параметр является строкой, включите флаг g в параметр flags .

Передача строки в качестве второго параметра

строка замены может включать следующие специальные шаблоны замены:

Шаблон Замена
$$ Вставляет символ доллара «$».
$& Вставляет сопоставившуюся подстроку.
$` Вставляет часть строки, предшествующую сопоставившейся подстроке.
$’ Вставляет часть строки, следующую за сопоставившейся подстрокой.
$n или $nn Символы n или nn являются десятичными цифрами, вставляет n-ную сопоставившуюся подгруппу из объекта RegExp в первом параметре.

Передача функции в качестве второго параметра

В качестве второго параметра вы можете передать функцию. В этом случае функция будет выполнена после произошедшего сопоставления. Результат вызова функции (её возвращаемое значение) будет использоваться в качестве строки замены (обратите внимание: описанные выше специальные шаблоны замены в этом случае не применяются). Обратите внимание, что функция будет вызвана несколько раз для каждого полного сопоставления, если регулярное выражение в первом параметре является глобальным.

Функция принимает следующие аргументы:

Возможное имя Получаемое значение
match Сопоставившаяся подстрока (соответствует шаблону замены $& , описанному выше).
p1, p2, . n-ная сопоставившаяся подгруппа из объекта RegExp в первом параметре метода replace() (соответствует шаблонам замены $1 , $2 и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение /(\a+)(\b+)/ , параметр p1 будет значение сопоставления с подгруппой \a+ , а параметр p2 — с подгруппой \b+ .
offset Смещение сопоставившейся подстроки внутри всей рассматриваемой строки (например, если вся строка равна ‘abcd’ , а сопоставившаяся подстрока равна ‘bc’ , то этот аргумент будет равен 1).
string Вся рассматриваемая строка.

Точное число аргументов будет зависеть от того, был ли первым аргументом объект RegExp и, если был, сколько подгрупп в нём определено.

Следующий пример установит переменную newString в значение ‘abc — 12345 — #$*%’ :

Примеры

Пример: использование флагов global и ignore с методом replace()

В следующем примере регулярное выражение включает флаги для глобального поиска и игнорирования регистра, которые позволяют методу replace() заменить все вхождения слова «яблоки» в строке на слово «апельсины».

Пример: передача регулярного выражения в метод replace()

В следующем примере в метод replace() передаётся регулярное выражение вместе с флагом игнорирования регистра.

Пример выведет строку ‘Twas the night before Christmas. ‘

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

Следующий скрипт меняет местами слова в строке. В качестве текста замены он использует шаблоны замены $1 и $2 .

Пример выведет строку ‘Смит, Джон’.

Пример: использование функции для изменения сопоставившихся символов

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

Функция замены своим параметром принимает сопоставившийся кусок и перед возвратом использует его для преобразования регистра и соединения с дефисом.

Вызов styleHyphenFormat(‘borderTop’) вернёт строку ‘border-top’.

Поскольку мы хотим провести дополнительные преобразования результата сопоставления до того, как будет использована окончательная подстановка, мы должны использовать функцию. Это заставляет нас принудительно вычислить сопоставление перед использование метода toLowerCase() . Если бы мы попытались использовать сопоставление без функции, метод toLowerCase() не сработал бы.

Происходит это потому, что сначала часть ‘$&’.toLowerCase() вычисляется в строковый литерал (результат по-прежнему равен ‘$&’ ), а только потом его символы используются в качестве шаблона.

Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию

В следующем примере градусы по Фаренгейту заменяются на эквивалентные градусы по Цельсию. Градусы по Фаренгейту должны быть числом, оканчивающимся на букву F. Функция возвращает количество градусов по Цельсию, оканчивающиеся на букву C. Например, если входное число равняется 212F, функция вернёт 100C. Если число равняется 0F, функция вернёт -17.77777777777778C.

Регулярное выражение test сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, p1 . Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code>f2c(), в градусы по Цельсию. Затем функция f2c() возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг s///e в Perl.

Пример: использование функции вместе с регулярным выражением для избавления от цикла for

Следующий пример принимает строку шаблона и преобразует её в массив объектов.

Входные данные:

Строка, состоящая из символов x , — и _

Выходные данные:

Массив объектов. Символ ‘x’ означает состояние ‘on’ , символ ‘-‘ (дефис) означает состояние ‘off’ , а символ ‘_’ (нижнее подчёркивание) означает продолжительность состояния ‘on’ .

Код:

Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла for .

Читать:
Как включить direct3d windows 7

Похожие статьи