std.regex
Регулярные выражения являются часто используемым методом сопоставления шаблонов в строках, а regex — это запоминающееся слово для шаблона в этом языке предметной области. Типичные задачи, обычно решаемые с помощью регулярных выражений, включают проверку ввода пользователя и повсеместно используемый поиск и замену в инструментах обработки текста.
| Категория | Функции |
|---|---|
| Сопоставление | bmatch match matchAll matchFirst |
| Построение | ctRegex escaper regex |
| Замена | replace replaceAll replaceAllInto replaceFirst replaceFirstInto |
| Разделение | split splitter |
| Объекты | Captures Regex RegexException RegexMatch Splitter StaticRegex |
Обзор
import std.regex;
import std.stdio;
void main()
{
// Print out all possible dd/mm/yy(yy) dates found in user input.
auto r = regex(r"\b[0-9][0-9]?/[0-9][0-9]?/[0-9][0-9](?:[0-9][0-9])?\b");
foreach (line; stdin.byLine)
{
// matchAll() returns a range that can be iterated
// to get all subsequent matches.
foreach (c; matchAll(line, r))
writeln(c.hit);
}
}
...
// Create a static regex at compile-time, which contains fast native code.
auto ctr = ctRegex!(`^.*/([^/]+)/?$`);
// It works just like a normal regex:
auto c2 = matchFirst("foo/bar", ctr); // First match found here, if any
assert(!c2.empty); // Be sure to check if there is a match before examining contents!
assert(c2[1] == "bar"); // Captures is a range of submatches: 0 = full match.
...
// multi-pattern regex
auto multi = regex([`\d+,\d+`,`(a-z]+):(\d+)`]);
auto m = "abc:43 12,34".matchAll(multi);
assert(m.front.whichPattern == 2);
assert(m.front[1] == "abc");
assert(m.front[2] == "43");
m.popFront();
assert(m.front.whichPattern == 1);
assert(m.front[1] == "12");
...
// The result of the `matchAll/matchFirst` is directly testable with if/assert/while.
// e.g. test if a string consists of letters:
assert(matchFirst("Letter", `^\p{L}+$`));
Синтаксис и общие сведения
Общее руководство состоит в том, чтобы поддерживать сложность регулярных выражений на уровне простоты, так как их возможности основаны на чисто символьной обработке. Поэтому они не подходят для задач, связанных с инвариантами более высокого уровня, такими как сопоставление целого числа, ограниченного интервалом [a, b]. Проверки такого рода лучше выполнять с помощью дополнительной пост-обработки.Базовый синтаксис не должен удивлять опытных пользователей регулярных выражений. Для знакомства с
std.regex ознакомьтесь с кратким обзором API модуля и его возможностями. Для новичков существуют и другие веб-ресурсы по регулярным выражениям, и легко можно найти хорошее справочное руководство с обучающими материалами.
Эта библиотека использует чрезвычайно распространённый вариант синтаксиса ECMAScript со следующими расширениями:
- Имена подвыражений с использованием синтаксиса Python.
- Свойства Unicode, такие как скрипты, блоки и общие двоичные свойства, например, Алфавитный, Пробел, Шестнадцатеричная цифра и т.д.
- Обратные ссылки произвольной длины и сложности, включая просмотр вперёд в обратном просмотре и наоборот.
Синтаксис шаблона
std.regex работает на уровне кодовых точек, "символ" в этой таблице обозначает одну кодовую точку Unicode.| Элемент шаблона | Семантика |
| Атомы | Сопоставление отдельных символов |
| любой символ, кроме [{|*+?()^$ | Сопоставляет сам символ. |
| . | В однострочном режиме соответствует любому символу. В противном случае он соответствует любому символу, кроме '\n' и '\r'. |
| [класс] | Сопоставляет один символ, который принадлежит этому классу символов. |
| [^класс] | Сопоставляет один символ, который не принадлежит этому классу символов. |
| \cC | Сопоставляет управляющий символ, соответствующий букве C |
| \xXX | Сопоставляет символ с шестнадцатеричным значением XX. |
| \uXXXX | Сопоставляет символ с шестнадцатеричным значением XXXX. |
| \U00YYYYYY | Сопоставляет символ с шестнадцатеричным значением YYYYYY. |
| \f | Сопоставляет символ перевода страницы. |
| \n | Сопоставляет символ перевода строки. |
| \r | Сопоставляет символ возврата каретки. |
| \t | Сопоставляет символ табуляции. |
| \v | Сопоставляет символ вертикальной табуляции. |
| \d | Сопоставляет любую цифру Unicode. |
| \D | Сопоставляет любой символ, кроме цифр Unicode. |
| \w | Сопоставляет любой символ слова (обратите внимание: это включает цифры). |
| \W | Сопоставляет любой небуквенный символ. |
| \s | Сопоставляет пробел, то же, что \p{White_Space}. |
| \S | Сопоставляет любой символ, кроме тех, которые распознаются как \s. |
| \\ | Сопоставляет символ \. |
| \c, где c — один из [|*+?() | Сопоставляет сам символ c. |
| \p{PropertyName} | Сопоставляет символ, который принадлежит набору Unicode PropertyName. Однобуквенные сокращения могут быть использованы без окружающих фигурных скобок. |
| \P{PropertyName} | Сопоставляет символ, который не принадлежит набору Unicode PropertyName. Однобуквенные сокращения могут быть использованы без окружающих фигурных скобок. |
| \p{InBasicLatin} | Сопоставляет любой символ, являющийся частью блока Unicode BasicLatin. |
| \P{InBasicLatin} | Сопоставляет любой символ, кроме символов в блоке Unicode BasicLatin. |
| \p{Cyrillic} | Сопоставляет любой символ, являющийся частью кириллического скрипта. |
| \P{Cyrillic} | Сопоставляет любой символ, кроме символов в кириллическом скрипте. |
| Квантификаторы | Укажите повторение других элементов |
| * | Сопоставляет предыдущий символ/подвыражение 0 или более раз. Жадный вариант - пытается как можно больше раз. |
| *? | Сопоставляет предыдущий символ/подвыражение 0 или более раз. Ленивый вариант - останавливается как можно раньше. |
| + | Сопоставляет предыдущий символ/подвыражение 1 или более раз. Жадный вариант - пытается как можно больше раз. |
| +? | Сопоставляет предыдущий символ/подвыражение 1 или более раз. Ленивый вариант - останавливается как можно раньше. |
| {n} | Сопоставляет предыдущий символ/подвыражение ровно n раз. |
| {n,} | Сопоставляет предыдущий символ/подвыражение n раз или больше. Жадный вариант - пытается как можно больше раз. |
| {n,}? | Сопоставляет предыдущий символ/подвыражение n раз или больше. Ленивый вариант - останавливается как можно раньше. |
| {n,m} | Сопоставляет предыдущий символ/подвыражение от n до m раз. Жадный вариант - пытается как можно больше раз, но не более m раз. |
| {n,m}? | Сопоставляет предыдущий символ/подвыражение от n до m раз. Ленивый вариант - останавливается как можно раньше, но не меньше n раз. |
| Другие | Подвыражения и альтернативы |
| (regex) | Сопоставляет подвыражение regex, сохраняя соответствующую часть текста для последующего извлечения. |
| (?#comment) | Встроенный комментарий, который игнорируется во время сопоставления. |
| (?:regex) | Сопоставляет подвыражение regex, не сохраняя соответствующую часть текста. Полезно для ускорения сопоставления. |
| A|B | Сопоставляет подвыражение A или, если это не удаётся, сопоставляет B. |
| (?P<name>regex) | Сопоставляет именованное подвыражение regex, маркируя его именем 'name'. При ссылке на сопоставленную часть текста имена работают как псевдонимы в дополнение к прямым номерам. |
| Утверждения | Сопоставление позиции, а не символа |
| ^ | Сопоставляет начало входных данных или строки (в многострочном режиме). |
| $ | Сопоставляет конец входных данных или строки (в многострочном режиме). |
| \b | Сопоставляет границу слова. |
| \B | Сопоставляет, когда не на границе слова. |
| (?=regex) | Утверждение просмотра вперёд нулевой ширины. Сопоставляет в точке, где подвыражение regex могло быть сопоставлено, начиная с текущей позиции. |
| (?!regex) | Утверждение отрицательного просмотра вперёд нулевой ширины. Сопоставляет в точке, где подвыражение regex не могло быть сопоставлено, начиная с текущей позиции. |
| (?<=regex) | Утверждение обратного просмотра нулевой ширины. Сопоставляет в точке, где подвыражение regex могло быть сопоставлено, заканчивая в текущей позиции (сопоставление происходит в обратном порядке). |
| (?<!regex) | Утверждение отрицательного обратного просмотра нулевой ширины. Сопоставляет в точке, где подвыражение regex не могло быть сопоставлено, заканчивая в текущей позиции (сопоставление происходит в обратном порядке). |
Классы символов
| Элемент шаблона | Семантика |
| Любой атом | Имеет то же значение, что и вне класса символов, за исключением ], которое должно быть написано как \] |
| a-z | Включает символы a, b, c, ..., z. |
| [a||b], [a--b], [a~~b], [a&&b] | Где a, b — произвольные классы, означает объединение, разность множеств, симметрическую разность множеств и пересечение соответственно. Любая последовательность элементов класса символов неявно образует объединение. |
Флаги регулярных выражений
| Флаг | Семантика |
| g | Глобальное регулярное выражение, повторяется по всему входу. |
| i | Сопоставление без учёта регистра. |
| m | Многострочный режим, сопоставляет ^, $ со стартовыми и конечными разделителями строк, а также со стартом и концом входных данных. |
| s | Однострочный режим, заставляет . сопоставлять '\n' и '\r' также. |
| x | Синтаксис в свободном формате, игнорирует пробелы в шаблоне, полезно для форматирования сложных регулярных выражений. |
Поддержка Unicode
Эта библиотека обеспечивает полную поддержку уровня 1* в соответствии с UTS 18. В частности:
- 1.1 Шестнадцатеричное представление с помощью \uxxxx, \U00YYYYYY, \xZZ.
- 1.2 Свойства Unicode.
- 1.3 Классы символов с операциями над множествами.
- 1.4 Границы слов используют весь набор символов "слова".
- 1.5 Использование простого преобразования регистров для сопоставления без учёта регистра по всему диапазону кодовых точек.
- 1.6 Уважение разрывов строк как любого из \u000A | \u000B | \u000C | \u000D | \u0085 | \u2028 | \u2029 | \u000D\u000A.
- 1.7 Работа на уровне кодовых точек.
Формат строки замены
Набор функций в этом модуле, выполняющих подстановку, опирается на простой формат для управления процессом. В частности, таблица ниже относится к аргументу
format функции replaceFirst и replaceAll. Строка формата может ссылаться на части совпадения с использованием следующей нотации.
| Форматный спецификатор | Заменяется на |
| $& | все совпадение. |
| $` | часть входных данных перед совпадением. |
| $' | часть входных данных после совпадения. |
| $$ | символ '$'. |
| \c , где c — любой символ | сам символ c. |
| \\ | символ '\'. |
| $1 .. $99 | подстрока с номером 1 до 99 соответственно. |
Направление работы с фрагментами и нулевым выделением памяти
Все совпадения, возвращаемые функциями сопоставления с образцом в этой библиотеке, являются фрагментами исходных данных. Заметным исключением является семейство функций
replace, которые генерируют новую строку из входных данных. В тех случаях, когда конечной целью является создание замены, функции
replaceFirstInto и replaceAllInto могут оказаться полезными, так как они избегают выделения памяти даже при замене. - Лицензия:
- Лицензия Boost 1.0.
- Авторы:
- Дмитрий Ольшанский, конструкции API и утилит смоделированы по оригинальным
std.regexУолтера Брайта и Андрея Александреску.
- Исходный код
- std/regex/package.d
- шаблон Regex(Char)
-
Regexобъект содержит шаблон регулярного выражения в скомпилированном виде.Экземпляры этого объекта создаются с помощью вызовов
regex. Это предполагаемая форма для кэширования и хранения часто используемых регулярных выражений.- Пример
- Проверка, не содержит ли этот объект скомпилированных шаблонов.
Regex!char r; assert(r.empty); r = regex(""); // Note: "" is a valid regex pattern. assert(!r.empty);Получение диапазона всех именованных захватов в регулярном выражении.import std.range; import std.algorithm; auto re = regex(`(?P<name>\w+) = (?P<var>\d+)`); auto nc = re.namedCaptures; static assert(isRandomAccessRange!(typeof(nc))); assert(!nc.empty); assert(nc.length == 2); assert(nc.equal(["name", "var"])); assert(nc[0] == "name"); assert(nc[1..$].equal(["var"]));
- псевдоним StaticRegex = Regex(Char);
-
StaticRegexявляетсяRegexобъектом, содержащим D-код, сгенерированный на этапе компиляции для ускорения поиска совпадений.Больше не используется, сохраняется как псевдоним Regex для обратной совместимости.
- @trusted auto regex(S : C[], C)(const S[] patterns, const(char)[] flags = "")
Ограничения: если (isSomeString!S);
@trusted auto regex(S)(S pattern, const(char)[] flags = "")
Ограничения: если (isSomeString!S); -
Компиляция шаблона регулярного выражения для последующего выполнения.
- Возвращает:
-
Regexобъект, работающий с входными данными, имеющими такую же ширину символов, что иpattern.
- Параметры:
S patternОдно регулярное выражение для поиска совпадений. S[] patternsМассив строк регулярных выражений. Результирующий Regexобъект будет соответствовать любому выражению; используйтеwhichPattern, чтобы узнать, какое.const(char)[] flagsАтрибуты (поддерживаются g, i, m, s и x)
- Выбрасывает:
-
RegexExceptionв случае возникновения ошибок во время компиляции.
- Примеры:
-
void test(S)() { // multi-pattern regex example S[] arr = [`([a-z]+):(\d+)`, `(\d+),\d+`]; auto multi = regex(arr); // multi regex S str = "abc:43 12,34"; auto m = str.matchAll(multi); writeln(m.front.whichPattern); // 1 writeln(m.front[1]); // "abc" writeln(m.front[2]); // "43" m.popFront(); writeln(m.front.whichPattern); // 2 writeln(m.front[1]); // "12" } import std.meta : AliasSeq; static foreach (C; AliasSeq!(string, wstring, dstring)) // Test with const array of patterns - see https://issues.dlang.org/show_bug.cgi?id=20301 static foreach (S; AliasSeq!(C, const C, immutable C)) test!S();
- enum auto ctRegex(alias pattern, alias flags = []);
-
Компиляция регулярного выражения с использованием CTFE и генерация оптимизированного машинного кода для поиска совпадений.
- Возвращает:
- Объект StaticRegex для более быстрого поиска совпадений.
- Параметры:
pattern Регулярное выражение flags Атрибуты (поддерживаются g, i, m, s и x)
- структура Captures(R) если (isSomeString!R);
-
Capturesобъект содержит подстроки, захваченные во время вызоваmatchили итерации поRegexMatchдиапазону.Первый элемент диапазона — это полное совпадение.
- Примеры:
-
import std.range.primitives : popFrontN; auto c = matchFirst("@abc#", regex(`(\w)(\w)(\w)`)); assert(c.pre == "@"); // Part of input preceding match assert(c.post == "#"); // Immediately after match assert(c.hit == c[0] && c.hit == "abc"); // The whole match writeln(c[2]); // "b" writeln(c.front); // "abc" c.popFront(); writeln(c.front); // "a" writeln(c.back); // "c" c.popBack(); writeln(c.back); // "b" popFrontN(c, 2); assert(c.empty); assert(!matchFirst("nothing", "something")); // Captures that are not matched will be null. c = matchFirst("ac", regex(`a(b)?c`)); assert(c); assert(!c[1]);
- @property R pre();
-
Часть входных данных перед совпадением.
- @property R post();
-
Часть входных данных сразу после совпадения.
- @property R hit();
-
Часть входных данных, соответствующая совпадению.
- @property R front();
@property R back();
void popFront();
void popBack();
const @property bool empty();
inout inout(R) opIndex()(size_t i); -
Интерфейс диапазона.
- const nothrow @safe bool opCast(T : bool)();
-
Явное приведение к типу bool. Полезно как сокращение для !(x.empty) в операторах if и assert.
import std.regex; assert(!matchFirst("nothing", "something")); - const nothrow @property @safe int whichPattern();
-
Номер сопоставленного шаблона (считая с 1 для первого шаблона). Возвращает 0 при отсутствии совпадения.
- Примеры:
-
import std.regex; writeln(matchFirst("abc", "[0-9]+", "[a-z]+").whichPattern); // 2
- R opIndex(String)(String i)
Ограничения: если (isSomeString!String); -
Поиск именованного подсовпадения.
import std.regex; import std.range; auto c = matchFirst("a = 42;", regex(`(?P<var>\w+)\s*=\s*(?P<value>\d+);`)); assert(c["var"] == "a"); assert(c["value"] == "42"); popFrontN(c, 2); //named groups are unaffected by range primitives assert(c["var"] =="a"); assert(c.front == "42"); - const @property size_t length();
-
Количество совпадений в этом объекте.
- @property ref auto captures();
-
Обратная совместимость с оригинальным std.regex.
- структура RegexMatch(R) если (isSomeString!R);
-
Состояние движка регулярных выражений, возвращаемое семейством функций
match.По сути, это упорядоченный диапазон Captures!R, генерируемый ленивым поиском совпадений во входных данных.
- @property R pre();
@property R post();
@property R hit(); -
Сокращения для front.pre, front.post, front.hit.
- inout @property inout(Captures!R) front();
void popFront();
auto save(); -
Функциональность для обработки последующих совпадений глобальных регулярных выражений через интерфейс диапазона:
import std.regex; auto m = matchAll("Hello, world!", regex(`\w+`)); assert(m.front.hit == "Hello"); m.popFront(); assert(m.front.hit == "world"); m.popFront(); assert(m.empty); - const @property bool empty();
-
Проверка, пуст ли этот объект совпадения.
- T opCast(T : bool)();
-
То же, что и !(x.empty), представлено для удобства в условных операторах.
- inout @property inout(Captures!R) captures();
-
То же, что и .front, для совместимости с оригинальным std.regex.
- @property R pre();
- auto match(R, RegEx)(R input, RegEx re)
Ограничения: если (isSomeString!R && isRegexFor!(RegEx, R));
auto match(R, String)(R input, String re)
Ограничения: если (isSomeString!R && isSomeString!String); -
Начать поиск совпадений
inputс шаблоном регулярного выраженияre, используя схему сопоставления NFA Томпсона.Использование этой функции не рекомендуется — используйте либо
matchAll, либоmatchFirst.
Делегирование типа операции по флагам "g" вскоре будет упразднено вместе со способностью выбирать точную схему сопоставления. Выбор схемы сопоставления сильно зависит от типа шаблона и может выполняться автоматически в каждом случае.- Возвращает:
- Объект
RegexMatch, содержащий состояние движка после первого совпадения.
- auto matchFirst(R, RegEx)(R input, RegEx re)
Ограничения: если (isSomeString!R && isRegexFor!(RegEx, R));
auto matchFirst(R, String)(R input, String re)
Ограничения: если (isSomeString!R && isSomeString!String);
auto matchFirst(R, String)(R input, String[] re...)
Ограничения: если (isSomeString!R && isSomeString!String); -
Найти первую (самую левую) часть
input, которая соответствует шаблонуre. Эта функция выбирает наиболее подходящий движок регулярных выражений в зависимости от свойств шаблона.Параметр
reможет быть одного из трех типов:- Простая строка(и), в этом случае она компилируется в байткод перед поиском совпадений.
- Regex!char (wchar/dchar), содержащий шаблон в виде скомпилированного байткода.
- StaticRegex!char (wchar/dchar), содержащий шаблон в виде скомпилированного машинного кода.
- Возвращает:
-
Captures, содержащий область совпадения и все подсовпадения, если совпадение найдено, иначе пустойCaptures.
- auto matchAll(R, RegEx)(R input, RegEx re)
Ограничения: если (isSomeString!R && isRegexFor!(RegEx, R));
auto matchAll(R, String)(R input, String re)
Ограничения: если (isSomeString!R && isSomeString!String);
auto matchAll(R, String)(R input, String[] re...)
Ограничения: если (isSomeString!R && isSomeString!String); -
Начать поиск всех неперекрывающихся совпадений шаблону
reв заданныхinput. Результат — ленивый диапазон совпадений, генерируемых по мере их обнаружения слева направо во входных данных.Эта функция выбирает наиболее подходящий движок регулярных выражений в зависимости от свойств шаблона.
Параметрreможет быть одного из трех типов:- Простая строка(и), в этом случае она компилируется в байткод перед поиском совпадений.
- Regex!char (wchar/dchar), содержащий шаблон в виде скомпилированного байткода.
- StaticRegex!char (wchar/dchar), содержащий шаблон в виде скомпилированного машинного кода.
- Возвращает:
-
RegexMatch, представляющий состояние совпадения после нахождения первого совпадения, или пустой, если оно не найдено.
- auto bmatch(R, RegEx)(R input, RegEx re)
Ограничения: если (isSomeString!R && isRegexFor!(RegEx, R));
auto bmatch(R, String)(R input, String re)
Ограничения: если (isSomeString!R && isSomeString!String); -
Начать поиск совпадений
inputс шаблоном регулярного выраженияre, используя традиционную схему сопоставления обратного отслеживания.Использование этой функции не рекомендуется — используйте либо
matchAll, либоmatchFirst.
Делегирование типа операции по флагам "g" вскоре будет упразднено вместе со способностью выбирать точную схему сопоставления. Выбор схемы сопоставления сильно зависит от типа шаблона и может выполняться автоматически в каждом случае.- Возвращает:
- Объект
RegexMatch, содержащий состояние движка после первого совпадения.
- R replaceFirst(R, C, RegEx)(R input, RegEx re, const(C)[] format)
Constraints: if (isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R)); -
Создаёт новую строку из
input, заменяя первое совпадение строкой, сгенерированной из неё согласно спецификаторуformat.Для замены всех совпадений используйте
replaceAll.- Параметры:
R inputстрока для поиска RegEx reскомпилированное регулярное выражение для использования const(C)[] formatстрока формата для генерации замен, см. строку формата.
- Возвращает:
- Строку того же типа, с первым найденным совпадением (если есть) заменённым. Если совпадений не найдено, возвращается исходная строка.
- Примеры:
-
writeln(replaceFirst("noon", regex("n"), "[$&]")); // "[n]oon"
- R replaceFirst(alias fun, R, RegEx)(R input, RegEx re)
Constraints: if (isSomeString!R && isRegexFor!(RegEx, R)); -
Это универсальный инструмент для замены, который создаёт новую строку, заменяя совпадения шаблона
reвinput. В отличие от других перегрузок, нет строки формата; вместо этого, совпадения передаются пользовательскому функторуfun, который возвращает новую строку для замены.Этот вариант заменяет первое совпадение в
input, см.replaceAllдля замены всех совпадений.- Возвращает:
- Новую строку того же типа, что и
input, со всеми совпадениями, заменёнными значениями, возвращённымиfun. Если совпадений не найдено, возвращается исходнаяinput.
- Примеры:
-
import std.conv : to; string list = "#21 out of 46"; string newList = replaceFirst!(cap => to!string(to!int(cap.hit)+1)) (list, regex(`[0-9]+`)); writeln(newList); // "#22 out of 46"
- @trusted void replaceFirstInto(Sink, R, C, RegEx)(ref Sink sink, R input, RegEx re, const(C)[] format)
Constraints: if (isOutputRange!(Sink, dchar) && isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R));
@trusted void replaceFirstInto(alias fun, Sink, R, RegEx)(Sink sink, R input, RegEx re)
Constraints: if (isOutputRange!(Sink, dchar) && isSomeString!R && isRegexFor!(RegEx, R)); -
Вариант
replaceFirst, который вместо выделения новой строки при каждом вызове выводит результат по частям вsink. Это позволяет эффективно строить окончательный результат по частям.Как и в семействе функций
replaceFirst, есть перегрузка для подстановки, управляемой строкой формата, и перегрузка с пользовательской функцией обратного вызова.- Примеры:
-
import std.array; string m1 = "first message\n"; string m2 = "second message\n"; auto result = appender!string(); replaceFirstInto(result, m1, regex(`([a-z]+) message`), "$1"); //equivalent of the above with user-defined callback replaceFirstInto!(cap=>cap[1])(result, m2, regex(`([a-z]+) message`)); writeln(result.data); // "first\nsecond\n"
- @trusted R replaceAll(R, C, RegEx)(R input, RegEx re, const(C)[] format)
Constraints: if (isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R)); -
Создаёт новую строку из
input, заменяя все фрагменты, соответствующие шаблонуre, строкой, сгенерированной из совпадения согласно спецификаторуformat.Для замены только первого совпадения используйте
replaceFirst.- Параметры:
R inputстрока для поиска RegEx reскомпилированное регулярное выражение для использования const(C)[] formatстрока формата для генерации замен, см. строку формата.
- Возвращает:
- Строку того же типа, что и
input, со всеми совпадениями (если есть) заменёнными. Если совпадений не найдено, возвращается исходная строка.
- Примеры:
-
// insert comma as thousands delimiter auto re = regex(r"(?<=\d)(?=(\d\d\d)+\b)","g"); writeln(replaceAll("12000 + 42100 = 54100", re, ",")); // "12,000 + 42,100 = 54,100"
- @trusted R replaceAll(alias fun, R, RegEx)(R input, RegEx re)
Constraints: if (isSomeString!R && isRegexFor!(RegEx, R)); -
Это универсальный инструмент для замены, который создаёт новую строку, заменяя совпадения шаблона
reвinput. В отличие от других перегрузок, нет строки формата; вместо этого, совпадения передаются пользовательскому функторуfun, который возвращает новую строку для замены.Этот вариант заменяет все найденные совпадения в
input, см.replaceFirstдля замены только первого совпадения.- Возвращает:
- Новую строку того же типа, что и
input, со всеми совпадениями, заменёнными значениями, возвращённымиfun. Если совпадений не найдено, возвращается исходнаяinput.
- Параметры:
R inputстрока для поиска RegEx reскомпилированное регулярное выражение fun делегат для использования
- Примеры:
-
string baz(Captures!(string) m) { import std.string : toUpper; return toUpper(m.hit); } // Capitalize the letters 'a' and 'r': auto s = replaceAll!(baz)("Strap a rocket engine on a chicken.", regex("[ar]")); writeln(s); // "StRAp A Rocket engine on A chicken."
- @trusted void replaceAllInto(Sink, R, C, RegEx)(Sink sink, R input, RegEx re, const(C)[] format)
Constraints: if (isOutputRange!(Sink, dchar) && isSomeString!R && is(C : dchar) && isRegexFor!(RegEx, R));
@trusted void replaceAllInto(alias fun, Sink, R, RegEx)(Sink sink, R input, RegEx re)
Constraints: if (isOutputRange!(Sink, dchar) && isSomeString!R && isRegexFor!(RegEx, R)); -
Вариант
replaceAll, который вместо выделения новой строки при каждом вызове выводит результат по частям вsink. Это позволяет эффективно строить окончательный результат по частям.Как и в
replaceAll, есть 2 перегрузки: одна со строкой формата, другая с пользовательским функтором.- Примеры:
-
// insert comma as thousands delimiter in fifty randomly produced big numbers import std.array, std.conv, std.random, std.range; static re = regex(`(?<=\d)(?=(\d\d\d)+\b)`, "g"); auto sink = appender!(char [])(); enum ulong min = 10UL ^^ 10, max = 10UL ^^ 19; foreach (i; 0 .. 50) { sink.clear(); replaceAllInto(sink, text(uniform(min, max)), re, ","); foreach (pos; iota(sink.data.length - 4, 0, -4)) writeln(sink.data[pos]); // ',' }
- R replace(alias scheme = match, R, C, RegEx)(R input, RegEx re, const(C)[] format)
Constraints: if (isSomeString!R && isRegexFor!(RegEx, R));
R replace(alias fun, R, RegEx)(R input, RegEx re)
Constraints: if (isSomeString!R && isRegexFor!(RegEx, R)); -
Старый API для замены; операция зависит от флагов шаблона
re. С флагом "g" он выполняет эквивалентreplaceAll, в противном случае он работает так же, какreplaceFirst.Использование этой функции не рекомендуется, используйте
replaceAllилиreplaceFirstявно. - struct Splitter(Flag!"keepSeparators" keepSeparators = No.keepSeparators, Range, alias RegEx = Regex) if (isSomeString!Range && isRegexFor!(RegEx, Range));
Splitter!(keepSeparators, Range, RegEx) splitter(Flag!"keepSeparators" keepSeparators = No.keepSeparators, Range, RegEx)(Range r, RegEx pat)
Constraints: if (is(BasicElementOf!Range : dchar) && isRegexFor!(RegEx, Range)); -
Разделяет строку
rс помощью регулярного выраженияpatв качестве разделителя.- Параметры:
keepSeparators флаг, определяющий, должны ли совпадения включаться в результирующий диапазон Range rстрока для разделения RegEx patшаблон для разделения
- Возвращает:
- Ленивый диапазон строк
- Примеры:
-
import std.algorithm.comparison : equal; auto s1 = ", abc, de, fg, hi, "; assert(equal(splitter(s1, regex(", *")), ["", "abc", "de", "fg", "hi", ""]));
- Примеры:
- Разделение по шаблону, но с сохранением совпадений в результирующем диапазоне
import std.algorithm.comparison : equal; import std.typecons : Yes; auto pattern = regex(`([\.,])`); assert("2003.04.05" .splitter!(Yes.keepSeparators)(pattern) .equal(["2003", ".", "04", ".", "05"])); assert(",1,2,3" .splitter!(Yes.keepSeparators)(pattern) .equal([",", "1", ",", "2", ",", "3"]));
- @property Range front();
@property bool empty();
void popFront();
@property auto save(); -
Примитивы для диапазонов вперёд.
- @trusted String[] split(String, RegEx)(String input, RegEx rx)
Constraints: if (isSomeString!String && isRegexFor!(RegEx, String)); -
Жадный вариант
splitter, который создаёт массив со сплитнутыми фрагментамиinput. - alias RegexException = std.regex.internal.ir.RegexException;
-
Объект исключения, выбрасываемый в случае ошибок во время компиляции регулярного выражения.
- auto escaper(Range)(Range r);
-
Диапазон, лениво генерирующий строку, экранированную для использования внутри регулярного выражения.
- Примеры:
-
import std.algorithm.comparison; import std.regex; string s = `This is {unfriendly} to *regex*`; assert(s.escaper.equal(`This is \{unfriendly\} to \*regex\*`));
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_regex.html