String.prototype.substring()
Содержание:
- Сравнение шаблонов с регулярным выражением
- Замена подстроки
- Строковые методы, поиск и замена
- Метод slice()
- jQuery Html Method
- 4. Key takeaway
- Строка как объект
- JavaScript
- JS Tutorial
- Функция в качестве второго параметра
- Примеры
- Доступ к свойствам
- Метод slice ()
- The slice() Method
- Синтаксис
- Строка в качестве второго параметра
- Syntax
- Улучшена поддержка юникода
- Классы символов
- regexp.test(str)
- str.replace(str|regexp, str|func)
Сравнение шаблонов с регулярным выражением
Шаблоны регулярных выражений включают использование букв, цифр, знаков препинания и т. д., а также набор специальных символов регулярных выражений (не путайте со специальными символами HTML).
Символы, которым дается особое значение в регулярном выражении: . Вам нужно будет использовать обратную косую черту, если вы хотите использовать их буквально. Например, если вы использовать в регулярном выражении знак точка (), вам нужно писать Все остальные символы автоматически принимают свои буквальные значения.
В следующих разделах описаны различные параметры, доступные для формулирования шаблонов:
Замена подстроки
Пример: заменим bbb на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str); echo $result; // результат: aaa zzz ccc zzz ddd
Мы заменили «bbb» на «zzz» и в $result запишется строка «aaa zzz ccc zzz ddd». У нас было 2 вхождения подстроки bbb и мы заменили их на zzz.
А что если нам нужно также заменить и ccc на zzz? Мы бы конечно могли запустить функцию 2 раза, в первый раз заменив первую подстроку, а второй раз другую, но можно просто указать массив подстрок поиска первым параметром.
Пример: заменим bbb и ccc на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(, 'zzz', $str); echo $result; // результат: aaa zzz zzz zzz ddd
Что если нам нужно заменить bbb на zzz, а ccc на www?
Мы конечно снова можем запустить функцию 2 раза, но оптимальнее с точки зрения производительности будет и вторым параметром передать массив. В первом массиве будут подстроки, которые мы ищем, а во втором те, на которые заменяем.
Пример: заменяем bbb на zzz, а ccc на www:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(, , $str); echo $result; // результат: aaa zzz www zzz ddd
Результат у нас правильный, но читабельность конечно страдает. А представьте если бы мы указывали сразу 50 таких строк для замены? И потом когда мы добавляем или заменяем строку, ее приходилось бы искать в 2 местах.
Более читабельным был бы код:
$str = 'aaa bbb ccc bbb ddd'; $replaces = ; $result = str_replace(array_keys($replaces), array_values($replaces), $str); echo $result; // результат: aaa zzz www zzz ddd
Тут нам помогли функции array_keys и array_values которые вернули все ключи и все значения соответственно.
Кстати для подобной замены вам не обязательно использовать функцию str_replace, а можно воспользоваться strtr, и тогда наш код выглядел бы еще более просто:
$str = 'aaa bbb ccc bbb ddd'; $result = strtr($str, ); echo $result; // результат: aaa zzz www zzz ddd
У функции str_replace также есть четвертый параметр $count, в котором мы ничего не передаем, а наоборот получаем количество вхождений.
Таким образом если дополнить наш пример:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str, $count); echo $result; // результат: aaa zzz ccc zzz ddd echo 'Вхождений: ' . $count; // Вхождений: 2
Обязательно прочитайте подробную документацию: https://www.php.net/manual/ru/function.str-replace.php
Строковые методы, поиск и замена
Следующие методы работают с регулярными выражениями из строк.
Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.
Так что вызовы эквивалентны:
var i = str.search(/\s/) var i = str.search("\\s")
При использовании кавычек нужно дублировать \ и нет возможности указать флаги. Если регулярное выражение уже задано строкой, то бывает удобна и полная форма
var regText = "\\s" var i = str.search(new RegExp(regText, "g"))
Возвращает индекс регулярного выражения в строке, или -1.
Если Вы хотите знать, подходит ли строка под регулярное выражение, используйте метод (аналогично RegExp-методы ). Чтобы получить больше информации, используйте более медленный метод (аналогичный методу ).
Этот пример выводит сообщение, в зависимости от того, подходит ли строка под регулярное выражение.
function testinput(re, str){ if (str.search(re) != -1) midstring = " contains "; else midstring = " does not contain "; document.write (str + midstring + re.source); }
Если в regexp нет флага , то возвращает тот же результат, что .
Если в regexp есть флаг , то возвращает массив со всеми совпадениями.
Чтобы просто узнать, подходит ли строка под регулярное выражение , используйте .
Если Вы хотите получить первый результат — попробуйте r.
В следующем примере используется, чтобы найти «Chapter», за которой следует 1 или более цифр, а затем цифры, разделенные точкой. В регулярном выражении есть флаг , так что регистр будет игнорироваться.
str = "For more information, see Chapter 3.4.5.1"; re = /chapter (\d+(\.\d)*)/i; found = str.match(re); alert(found);
Скрипт выдаст массив из совпадений:
- Chapter 3.4.5.1 — полностью совпавшая строка
- 3.4.5.1 — первая скобка
- .1 — внутренняя скобка
Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с . Будут найдены все буквы от А до Е и от а до е, каждая — в отдельном элементе массива.
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var regexp = //gi; var matches = str.match(regexp); document.write(matches); // matches =
Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис — такой:
var newString = str.replace(regexp/substr, newSubStr/function)
- Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2
- Строка, которая будет заменена на .
- Строка, которая заменяет подстроку из аргумента номер 1.
- Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).
Метод не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.
Чтобы осуществить глобальную замену, включите в регулярное выражение флаг .
Если первый аргумент — строка, то она не преобразуется в регулярное выражение, так что, например,
var ab = "a b".replace("\\s","..") // = "a b"
Вызов replace оставил строку без изменения, т.к искал не регулярное выражение , а строку «\s».
В строке замены могут быть такие спецсимволы:
Pattern | Inserts |
Вставляет «$». | |
Вставляет найденную подстроку. | |
Вставляет часть строки, которая предшествует найденному вхождению. | |
Вставляет часть строки, которая идет после найденного вхождения. | |
or | Где или — десятичные цифры, вставляет подстроку вхождения, запомненную -й вложенной скобкой, если первый аргумент — объект RegExp. |
Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.
В функции можно динамически генерировать и возвращать строку подстановки.
Первый параметр функции — найденная подстрока. Если первым аргументом является объект , то следующие параметров содержат совпадения из вложенных скобок. Последние два параметра — позиция в строке, на которой произошло совпадение и сама строка.
Например, следующий вызов возвратит XXzzzz — XX , zzzz.
function replacer(str, p1, p2, offset, s) { return str + " - " + p1 + " , " + p2; } var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)
Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра , .
Если бы были три скобки, то в функцию пришлось бы добавить параметр .
Следующая функция заменяет слова типа на :
function styleHyphenFormat(propertyName) { function upperToHyphenLower(match) { return '-' + match.toLowerCase(); } return propertyName.replace(//, upperToHyphenLower); }
Метод slice()
Метод извлекает часть строки и возвращает извлеченную часть в новой строке.
Метод принимает 2 параметра: начальную позицию и конечную позицию (конец не включен).
В этом примере часть строки вырезается из позиции 7 в позицию 12 (13-1):
var str = «Яблоко, Банан, Киви»;
var res = str.slice(7, 13);
Результатом res будет:
Помните: JavaScript считает позиции с нуля. Первая позиция — 0.
Если параметр отрицательный, позиция отсчитывается от конца строки
В этом примере часть строки вырезается из позиции -12 в позицию -6:
var str = «Яблоко, Банан, Киви»;
var res = str.slice(-12, -6);
Результатом res будет:
Если вы опустите второй параметр, метод вырежет остальную часть строки:
var res = str.slice(7);
или, считая с конца:
jQuery Html Method
The jQuery html () method is used to change the entire contents of the selected elements. This selected element replaces content with new content.
Syntax jQuery Html Method
html() method returns the content of first matched element.
Html() method sets the content of matched element.
It sets the content using function.
The HTML () method is used either to set content or to return the contents of the selected elements.
- To set the content :- When you use this method to set the content, it overwrites the contents of all matched elements.
- To return the content :- When you use this method to return content, it first returns the content of the matched element.
Parameters of jQuery Html Method
Parameter | Description |
---|---|
Content | It is an essential parameter. It is used to specify the new content for the selected elements. It can also contain HTML tags. |
Function (index, currentcontent) | It is an optional parameter. It specifies a function that returns the new content for the selected elements.Index: It shows the index position of the element in the set.Currentcontent: It shows the current HTML content of the selected element. |
Ex 1 :- jQuery html() method
Let’s see an example 1 of html() method.
<!DOCTYPE html> <html> <title>Learn Jquery Html Method</title> <head> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> $(document).ready(function(){ $("#btn_click").click(function(){ $("#para").html("Hello <b>there, Thanks to try it</b>"); }); }); </script> </head> <body> <button id="btn_click">Click here to change the content</button> <p id="para">This is a paragraph. When you click the button after that it will change.</p> </body> </html>
Ex 2 :- jQuery html()
Let’s see example2 of html method. This example returns the first match of element.
<!DOCTYPE html> <html> <head> <title> jQuery html() Method </title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> </head> <body style = "text-align:center;"> <h1 style = "color:blue;" >Hello World </h1> <h2>jQuery | html() Method </h2> <button id="btn-click">Click</button> <script> $(document).ready(function(){ $("#btn-click").click(function(){ alert($("h2").html()); }); }); </script> </body> </html>
Ex 3 :- jQuery replace text
Let’s take a new example using the jQuery html() method. It will replace the h2 tag text. See the example below
<!DOCTYPE html> <html> <head> <title> jQuery replace text using html() </title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> </head> <body style = "text-align:center;"> <h1 style = "color:blue;" >Hello World </h1> <h2>jQuery | html() Method </h2> <button id="btn-click">Click</button> <script> $(document).ready(function(){ $("#btn-click").click(function(){ $("h2").html('Hello'); }); }); </script> </body> </html>
Recommended jQuery Tutorial
- jQuery Text Method By Example
- Get and Set Input, Select box, Text, radio Value jQuery
- Duplicate Html Elements Using jQuery By Example
- jQuery | Event MouseUp By Example
- Event jQuery Mouseleave By Example
- jQuery Event Mouseenter Example
- Event jQuery MouseOver & MouseOut By Example
- keyup jquery event example
- Jquery Click Event Method with E.g.
- Event jQuery. Blur By Example
- jQuery form submit event with example
- keydown function jQuery
- List of jQuery Events Handling Methods with examples
- Jquery Selector by .class | name | #id | Elements
- How to Get the Current Page URL in jQuery
- jQuery Ajax Get() Method Example
- get radio button checked value jquery by id, name, class
- jQuery Set & Get innerWidth & innerHeight Of Html Elements
- jQuery Get Data Text, Id, Attribute Value By Example
- Set data attribute value jquery
- select multiple class in jquery
- How to Remove Attribute Of Html Elements In jQuery
- How to Checked Unchecked Checkbox Using jQuery
- jQuery removeClass & addClass On Button Click By E.g.
- To Remove whitespace From String using jQuery
- jQuery Ajax Post Method Example
- jQuery Ajax Get Method Example
- To Load/Render html Page in div Using jQuery Ajax $.load
- jQuery Sibling Methods – To Find Siblings Elements
- jQuery Find Siblings Elements with Class, id
4. Key takeaway
The primitive approach to replace all occurrences is to split the string into chunks by the search string, the join back the string placing the replace string between chunks: . This approach works, but it’s hacky.
Another approach is to use with a regular expression having the global flag enabled.
Unfortunately, you cannot easily generate regular expressions from a string at runtime, because the special characters of regular expressions have to be escaped. And dealing with a regular expression for a simple replacement of strings is overwhelming.
Finally, the new string method replaces all string occurrences. The method is a proposal at stage 4, and hopefully, it will land in a new JavaScript standard pretty soon.
My recommendation is to use to replace strings.
Строка как объект
По умолчанию в JavaScript строка принимает фиксированные значения, однако с помощью ключевого слова и метода строку можно превратить в объект и определить для неё какие либо свойства.
var stringObject = new string(«This string is object»); //Определение строки как объектный тип данных
stringObject.name = «newString»; //Определение свойства name со значением newString
1 |
varstringObject=newstring(«This string is object»);//Определение строки как объектный тип данных stringObject.name=»newString»;//Определение свойства name со значением newString |
Приведение строки к типу объект в большинстве случаев не представляет ценности, более того, такое преобразование способствует замедлению выполнения кода и может привести к непредвиденным последствиям.
JavaScript
JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()
JS Boolean
constructor
prototype
toString()
valueOf()
JS Classes
constructor()
extends
static
super
JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()
JS Error
name
message
JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()
JS JSON
parse()
stringify()
JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
clz32()
cos()
cosh()
E
exp()
expm1()
floor()
fround()
LN2
LN10
log()
log10()
log1p()
log2()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sign()
sin()
sinh()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()
JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()
JS OperatorsJS RegExp
Modifiers:
g
i
m
Groups:
(x|y)
Metacharacters:
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx
Quantifiers:
+
*
?
{X}
{X,Y}
{X,}
$
^
?=
?!
Properties:
constructor
global
ignoreCase
lastIndex
multiline
source
Methods:
compile()
exec()
test()
toString()
JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while
JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()
JS Tutorial
JS HOMEJS IntroductionJS Where ToJS OutputJS StatementsJS SyntaxJS CommentsJS VariablesJS LetJS ConstJS OperatorsJS ArithmeticJS AssignmentJS Data TypesJS FunctionsJS ObjectsJS EventsJS StringsJS String MethodsJS String SearchJS String TemplatesJS NumbersJS Number MethodsJS ArraysJS Array MethodsJS Array SortJS Array IterationJS Array ConstJS DatesJS Date FormatsJS Date Get MethodsJS Date Set MethodsJS MathJS RandomJS BooleansJS ComparisonsJS ConditionsJS SwitchJS Loop ForJS Loop For InJS Loop For OfJS Loop WhileJS BreakJS IterablesJS SetsJS MapsJS TypeofJS Type ConversionJS BitwiseJS RegExpJS ErrorsJS ScopeJS HoistingJS Strict ModeJS this KeywordJS Arrow FunctionJS ClassesJS JSONJS DebuggingJS Style GuideJS Best PracticesJS MistakesJS PerformanceJS Reserved Words
Функция в качестве второго параметра
Если вы указываете функцию в качестве второго параметра, то она вызывается при каждом совпадении. При наличии одного совпадения в нее передаются три аргумента: совпадение, позиция совпадения в строке и вся строка. Если групп захвата несколько, каждая совпавшая строка передается в функцию как аргумент, при этом двумя последними аргументами являются позиция совпадения с шаблоном в строке и оригинальная строка. Результат вызова функции (её возвращаемое значение) будет использоваться в качестве строки замены.
Функция принимает следующие аргументы:
- – найденное совпадение, (cоответствует шаблону замены $&, описанному выше).
- – содержимое скобок (если есть), из объекта RegExp в первом параметре метода replace() (cоответствует шаблонам замены $1, $2 и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение /(\a+)(\b+)/, параметр p1 будет значение сопоставления с подгруппой \a+, а параметр p2 — с подгруппой \b+.
- – позиция, на которой найдено совпадение (например, если вся строка равна ‘abcd’, а сопоставившаяся подстрока равна ‘bc’, то этот аргумент будет равен 1).
- – исходная строка.
Если скобок в регулярном выражении нет, то у функции всегда будет ровно 3 аргумента: replacer(match, offset, string).
Пример, с использованием функции, выводящей полную информацию о совпадениях:
Выполнить код »
Скрыть результаты
При наличии в регулярном выражении двух скобок функция принимает уже 5 аргументов:
Выполнить код »
Скрыть результаты
← предыдущая
следующая →
Примеры
В следующем примере регулярное выражение включает флаги для глобального поиска и игнорирования регистра, которые позволяют методу заменить все вхождения слова «яблоки» в строке на слово «апельсины».
В следующем примере в метод передаётся регулярное выражение вместе с флагом игнорирования регистра.
Пример выведет строку ‘Twas the night before Christmas…’
Следующий скрипт меняет местами слова в строке. В качестве текста замены он использует шаблоны замены и .
Пример выведет строку ‘Смит, Джон’.
В этом примере все входящие в строку (латинские) буквы в верхнем регистре преобразуются в нижний регистр, а перед самой буквой вставляется дефис
Здесь важно то, что прежде чем элемент вставится в качестве замены, над ним нужно провести дополнительные преобразования
Функция замены своим параметром принимает сопоставившийся кусок и перед возвратом использует его для преобразования регистра и соединения с дефисом.
Вызов вернёт строку ‘border-top’.
Поскольку мы хотим провести дополнительные преобразования результата сопоставления до того, как будет использована окончательная подстановка, мы должны использовать функцию. Это заставляет нас принудительно вычислить сопоставление перед использование метода . Если бы мы попытались использовать сопоставление без функции, метод не сработал бы.
Происходит это потому, что сначала часть вычисляется в строковый литерал (результат по-прежнему равен ), а только потом его символы используются в качестве шаблона.
В следующем примере градусы по Фаренгейту заменяются на эквивалентные градусы по Цельсию. Градусы по Фаренгейту должны быть числом, оканчивающимся на букву F. Функция возвращает количество градусов по Цельсию, оканчивающиеся на букву C. Например, если входное число равняется 212F, функция вернёт 100C. Если число равняется 0F, функция вернёт -17.77777777777778C.
Регулярное выражение сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, . Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code>f2c(), в градусы по Цельсию. Затем функция возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг в Perl.
Следующий пример принимает строку шаблона и преобразует её в массив объектов.
Входные данные:
Строка, состоящая из символов , и
x-x_ x---x---x---x--- x-xxx-xx-x- x_x_x___x___x___
Выходные данные:
Массив объектов. Символ означает состояние , символ (дефис) означает состояние , а символ (нижнее подчёркивание) означает продолжительность состояния .
Код:
Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла .
Доступ к свойствам
ECMAScript 5 (2009) разрешает доступ к свойствам для строк:
Пример
var str = «ПРИВЕТ МИР»;
str; // возвращается П
Доступ к свойствам может быть немного непредсказуемым:
- Не работает в Internet Explorer 7 или более ранней версии.
- Это делает строки похожими на массивы (но это не так)
- Если символ не найден, [] возвращает значение undefined, а charAt () возвращает пустую строку.
- Он доступен только для чтения. str = «A» не выдает ошибки (но не работает!)
Пример
var str = «ПРИВЕТ МИР»;
str = «A»;
// Не дает никакой ошибки, но и не работает
str; // возвращается П
Если вы хотите работать со строкой как с массивом, вы можете преобразовать ее в массив.
Метод slice ()
slice () извлекает часть строки и возвращает извлеченную часть в новой строке.
Метод принимает 2 параметра: начальный индекс (положение) и Конечный индекс (позиция).
Этот пример нарезает часть строки из позиции 7 в положение 13:
var str = «Apple, Banana, Kiwi»;
var res = str.slice(7, 13);
The result of res will be:
Banana
Если параметр имеет отрицательное значение, позиция учитывается от конца строки.
Этот пример нарезает часть строки из позиции-12 в положение-6:
var str = «Apple, Banana, Kiwi»;
var res = str.slice(-12, -6);
The result of res will be:
Banana
Если опустить второй параметр, метод выполнит срез оставшейся части строки:
var res = str.slice(7);
или, считая с конца:
The slice() Method
extracts a part of a string and returns the
extracted part in a new string.
The method takes 2 parameters: the start position, and the end position (end
not included).
This example slices out a portion of a string from position 7 to position 12 (13-1):
let str = «Apple, Banana, Kiwi»;
let part = str.slice(7, 13);
Remember: JavaScript counts positions from zero. First position is 0.
If a parameter is negative, the position is counted from the
end of the string.
This example slices out a portion of a string from position -12 to position
-6:
let str = «Apple, Banana, Kiwi»;
let part = str.slice(-12, -6);
If you omit the second parameter, the method will slice out the rest of the string:
let part = str.slice(7);
or, counting from the end:
Синтаксис
regexp
Объект регулярного выражения . Сопоставление заменяется возвращаемым значением второго параметра.
substr
Строка, которая должна быть заменена на
Обратите внимание, будет заменено только первое вхождение искомой строки.
newSubStr
Строка, которая заменяет подстроку, полученную из первого параметра. Поддерживает несколько специальных шаблонов замены.
function
Функция, вызываемая для создания новой подстроки, размещаемой вместо подстроки из первого параметра.
flags
Строка, содержащая любую комбинацию флагов : g – глобальное соответствие, i – игнорировать регистр, m – соответствие по нескольким строкам
Этот параметр используется, только если первый параметр является строкой.
Строка в качестве второго параметра
Если вы указываете строку как второй параметр — она может включать в себя следующие специальные шаблоны замены:
Шаблон | Замена |
Вставляет символ доллара «$». | |
Вставляет всё найденное совпадение. | |
Вставляет часть строки до совпадения. | |
Вставляет часть строки после совпадения. | |
n-ная группа захвата, где n – значение от О до 9. Например, $1 – это первая группа захвата, $2 – вторая, и т. д. Если захвата нет, используется пустая строка. | |
nn-ная группа захвата, где nn – значение от О1 до 91. Например, $01 – это первая группа захвата, $02 – вторая, и т. д. Если захвата нет, используется пустая строка. |
Пример использования скобок и $1, $2:
Выполнить код »
Скрыть результаты
Пример, с использованием подстроки, совпадающей со всем шаблоном $&:
Выполнить код »
Скрыть результаты
Syntax
const newStr = str.replaceAll(regexp|substr, newSubstr|function)
Когда вы используете `regexp` вы должны установить флаг глобального поиска («g»), иначе вернётся ошибка : «replaceAll must be called with a global RegExp».
- (pattern)
- Регулярное выражение или буква с глобальным флагом поиска («g»). Совпадения меняются на или значении возвращённое указанной функцией . A RegExp без глобального флага поиска («g») вернёт ошибку : «replaceAll must be called with a global RegExp».
- Подстрока, которая заменится . Обрабатывается как буквенная строка, не интерпретируется как регулярное выражение.
- (replacement)
- Новая строка, которая заменяет найденные подстроки указанные в или параметрах. Поддерживается ряд специальных шаблонов замены; смотрите «» блок ниже.
- (replacement)
- Функция вызванная при создании новой строки которая используется для замены совпадений указанных в or . Аргументы применяемы в этой функции описываются в «» блок ниже.
Новая строка, в которой все совпадения замены на указанную подстроку или специальный шаблон.
Улучшена поддержка юникода
Внутренняя кодировка строк в JavaScript – это UTF-16, то есть под каждый символ отводится ровно два байта.
Но под всевозможные символы всех языков мира 2 байт не хватает. Поэтому бывает так, что одному символу языка соответствует два юникодных символа (итого 4 байта). Такое сочетание называют «суррогатной парой».
Самый частый пример суррогатной пары, который можно встретить в литературе – это китайские иероглифы.
Заметим, однако, что не всякий китайский иероглиф – суррогатная пара. Существенная часть «основного» юникод-диапазона как раз отдана под китайский язык, поэтому некоторые иероглифы – которые в неё «влезли» – представляются одним юникод-символом, а те, которые не поместились (реже используемые) – двумя.
Например:
В тексте выше для первого иероглифа есть отдельный юникод-символ, и поэтому длина строки , а для второго используется суррогатная пара. Соответственно, длина – .
Китайскими иероглифами суррогатные пары, естественно, не ограничиваются.
Ими представлены редкие математические символы, а также некоторые символы для эмоций, к примеру:
В современный JavaScript добавлены методы String.fromCodePoint и str.codePointAt – аналоги и , корректно работающие с суррогатными парами.
Например, считает суррогатную пару двумя разными символами и возвращает код каждой:
…В то время как возвращает его Unicode-код суррогатной пары правильно:
Метод корректно создаёт строку из «длинного кода», в отличие от старого .
Например:
Более старый метод в последней строке дал неверный результат, так как он берёт только первые два байта от числа и создаёт символ из них, а остальные отбрасывает.
Есть и ещё синтаксическое улучшение для больших Unicode-кодов.
В JavaScript-строках давно можно вставлять символы по Unicode-коду, вот так:
Синтаксис: , где – четырёхзначный шестнадцатиричный код, причём он должен быть ровно четырёхзначным.
«Лишние» цифры уже не войдут в код, например:
Чтобы вводить более длинные коды символов, добавили запись , где – максимально восьмизначный (но можно и меньше цифр) код.
Например:
Во многих языках есть символы, которые получаются как сочетание основного символа и какого-то значка над ним или под ним.
Например, на основе обычного символа существуют символы: . Самые часто встречающиеся подобные сочетания имеют отдельный юникодный код. Но отнюдь не все.
Для генерации произвольных сочетаний используются несколько юникодных символов: основа и один или несколько значков.
Например, если после символа идёт символ «точка сверху» (код ), то показано это будет как «S с точкой сверху» .
Если нужен ещё значок над той же буквой (или под ней) – без проблем. Просто добавляем соответствующий символ.
К примеру, если добавить символ «точка снизу» (код ), то будет «S с двумя точками сверху и снизу» .
Пример этого символа в JavaScript-строке:
Такая возможность добавить произвольной букве нужные значки, с одной стороны, необходима, а с другой стороны – возникает проблемка: можно представить одинаковый с точки зрения визуального отображения и интерпретации символ – разными сочетаниями Unicode-кодов.
Вот пример:
В первой строке после основы идёт сначала значок «верхняя точка», а потом – нижняя, во второй – наоборот. По кодам строки не равны друг другу. Но символ задают один и тот же.
С целью разрешить эту ситуацию, существует юникодная нормализация, при которой строки приводятся к единому, «нормальному», виду.
В современном JavaScript это делает метод str.normalize().
Забавно, что в данной конкретной ситуации приведёт последовательность из трёх символов к одному: \u1e68 (S с двумя точками).
Это, конечно, не всегда так, просто в данном случае оказалось, что именно такой символ в юникоде уже есть. Если добавить значков, то нормализация уже даст несколько символов.
Для большинства практических задач информации, данной выше, должно быть вполне достаточно, но если хочется более подробно ознакомиться с вариантами и правилами нормализации – они описаны в приложении к стандарту юникод Unicode Normalization Forms.
Классы символов
Квадратные скобки, окружающие шаблон символов, называются классом символов, например . Класс символов всегда соответствует одному символу из списка указанных символов, что означает, что выражение соответствует только символу a, b или c.
Также могут быть определены классы отрицательных символов, которые соответствуют любому символу, кроме указанных в скобках. Класс отрицанных символов определяется путем размещения символа вставки () сразу после открывающей скобки, например , который соответствует любому символу, кроме a, b и c.
Вы также можете определить диапазон символов, используя символ дефиса () внутри класса символов, например . Давайте посмотрим на некоторые примеры классов:
RegExp | Что оно делает |
---|---|
Соответствует любому из символов a, b или c. | |
Соответствует любому одному символу, кроме a, b или c. | |
Соответствует любому символу от строчной буквы a до строчной буквы z. | |
Соответствует любому символу от прописных букв A до прописных букв Z. | |
Соответствует любому символу от строчной буквы a до прописной буквы Z. | |
Соответствует одной цифре от 0 до 9. | |
Соответствует одному символу между a и z или между 0 и 9. |
В следующем примере показано, как определить, существует ли шаблон в строке или нет, используя регулярное выражение с методом JavaScript :
Кроме того, вы можете добавить к регулярному выражению, чтобы найти все совпадения в строке:
Регулярные выражения не являются исключительными для JavaScript. Такие языки, как Java, Perl, Python, PHP и т. д., используют одинаковые обозначения для поиска шаблонов в тексте.
regexp.test(str)
The method looks for a match and returns whether it exists.
For instance:
An example with the negative answer:
If the regexp has flag , then looks from property and updates this property, just like .
So we can use it to search from a given position:
Same global regexp tested repeatedly on different sources may fail
If we apply the same global regexp to different inputs, it may lead to wrong result, because call advances property, so the search in another string may start from non-zero position.
For instance, here we call twice on the same text, and the second time fails:
That’s exactly because is non-zero in the second test.
To work around that, we can set before each search. Or instead of calling methods on regexp, use string methods , they don’t use .
str.replace(str|regexp, str|func)
Это универсальный метод поиска-и-замены, один из самых полезных. Этакий швейцарский армейский нож для поиска и замены в строке.
Мы можем использовать его и без регулярных выражений, для поиска-и-замены подстроки:
Хотя есть подводный камень.
Когда первый аргумент является строкой, он заменяет только первое совпадение.
Вы можете видеть это в приведённом выше примере: только первый заменяется на .
Чтобы найти все дефисы, нам нужно использовать не строку , а регулярное выражение с обязательным флагом :
Второй аргумент – строка замены. Мы можем использовать специальные символы в нем:
Спецсимволы | Действие в строке замены |
---|---|
вставляет | |
вставляет всё найденное совпадение | |
вставляет часть строки до совпадения | |
вставляет часть строки после совпадения | |
если это 1-2 значное число, то вставляет содержимое n-й скобки | |
вставляет содержимое скобки с указанным именем |
Например:
Для ситуаций, которые требуют «умных» замен, вторым аргументом может быть функция.
Она будет вызываться для каждого совпадения, и её результат будет вставлен в качестве замены.
Функция вызывается с аргументами :
- – найденное совпадение,
- – содержимое скобок (см. главу Скобочные группы).
- – позиция, на которой найдено совпадение,
- – исходная строка,
- – объект с содержимым именованных скобок (см. главу Скобочные группы).
Если скобок в регулярном выражении нет, то будет только 3 аргумента: .
Например, переведём выбранные совпадения в верхний регистр:
Заменим каждое совпадение на его позицию в строке:
В примере ниже две скобки, поэтому функция замены вызывается с 5-ю аргументами: первый – всё совпадение, затем два аргумента содержимое скобок, затем (в примере не используются) индекс совпадения и исходная строка:
Если в регулярном выражении много скобочных групп, то бывает удобно использовать остаточные аргументы для обращения к ним:
Или, если мы используем именованные группы, то объект с ними всегда идёт последним, так что можно получить его так:
Использование функции даёт нам максимальные возможности по замене, потому что функция получает всю информацию о совпадении, имеет доступ к внешним переменным и может делать всё что угодно.