Regular Expressions
Замены с регулярными выражениями
Поиск…
параметры
В соответствии | Описание |
---|---|
$ номер | Заменяет подстроку, соответствующую номеру группы. |
$ {Имя} | Заменяет подстроку, соответствующую названию именованной группы . |
$$ | Исчерпал символ $ $ в строке результата (замены). |
$ & ($ 0) | Заменяет всю согласованную строку. |
$ + ($ &) | Заменяет согласованный текст на последнюю захваченную группу. |
$ ` | Заменяет весь согласованный текст с каждым несогласованным текстом перед матчем. |
$» | Заменяет весь согласованный текст с каждым несогласованным текстом после матча. |
$ _ | Заменяет весь согласованный текст на всю строку. |
Замечания: | Курсивные термины означают, что строки неустойчивы (могут варьироваться в зависимости от вашего аромата регулярного выражения). |
Основы замещения
Одним из наиболее распространенных и полезных способов замены текста с помощью регулярного выражения является использование групп захвата .
Или даже группу Named Capture , как ссылку на хранилище или замену данных.
В документах регулярных выражений довольно похожи друг на друга, поэтому может быть важно никогда не замешать замещения (т.е. $1
) с Backreferences (т.е. \1
). Условия замены используются в заменяющем тексте; Backreferences, в чистом выражении Regex. Несмотря на то, что некоторые языки программирования принимают как для замещений, это не обнадеживает.
Будем говорить, что у нас есть это регулярное выражение: /hello(\s+)world/i
. Всякий раз, когда ссылается $number
(в данном случае $1
), вместо пробелов будут заменены пробелы, сопоставляемые \s+
.
Тот же результат будет отображаться с помощью регулярного выражения: /hello(?<spaces>\s+)world/i
. И поскольку у нас есть именованная группа, мы также можем использовать ${spaces}
.
В этом же примере мы также можем использовать $0
или $&
( Примечание: $&
вместо этого можно использовать вместо $+
, что означает получение LAST группы захвата в других машинах с регулярными выражениями), в зависимости от используемого вами эффекта regex, чтобы получить весь согласованный текст. (т.е. $&
должен возвращать hEllo woRld
для строки: hEllo woRld of Regex!
)
Взгляните на этот простой пример подстановки, используя адаптированную цитату Джона Леннона, используя синтаксис
$number
и ${name}
: Пример простой группы захвата:
Именованный пример группы захвата:
Расширенная замена
Некоторые языки программирования имеют свои собственные особенности Regex, например, $+
term (в C #, Perl, VB и т. Д.), Который заменяет сопоставленный текст на последнюю захваченную группу.
Пример:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b(\w+)\s\1\b";
string substitution = "$+";
string input = "The the dog jumped over the fence fence.";
Console.WriteLine(Regex.Replace(input, pattern, substitution,
RegexOptions.IgnoreCase));
}
}
// The example displays the following output:
// The dog jumped over the fence.
Пример из сети разработчиков Microsoft Official [1]
Другими редкими условиями замены являются
$`
и $'
: $`
= Заменяет совпадения с текстом перед соответствующей строкой
$'
= Заменяет совпадения с текстом после соответствующей строки
В связи с этим эти строки замены должны выполнять свою работу следующим образом:
Regex: /part2/
Input: "part1part2part3"
Replacement: "$`"
Output: "part1part1part3" //Note that part2 was replaced with part1, due &` term
---------------------------------------------------------------------------------
Regex: /part2/
Input: "part1part2part3"
Replacement: "$'"
Output: "part1part3part3" //Note that part2 was replaced with part3, due &' term
Ниже приведен пример этих замещений, работающих над частью javascript:
var rgx = /middle/;
var text = "Your story must have a beginning, middle, and end"
console.log(text.replace(rgx, "$`"));
//Logs: "Your story must have a beginning, Your story must have a beginning, , and end"
console.log(text.replace(rgx, "$'"))
//Logs: "Your story must have a beginning, , and end, and end"
Существует также термин
$_
который вместо этого извлекает весь сопоставленный текст: Regex: /part2/
Input: "part1part2part3"
Replacement: "$_"
Output: "part1part1part2part3part3" //Note that part2 was replaced with part1part2part3,
// due $_ term
Преобразование этого в VB даст нам следующее:
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim input As String = "ABC123DEF456"
Dim pattern As String = "\d+"
Dim substitution As String = "$_"
Console.WriteLine("Original string: {0}", input)
Console.WriteLine("String with substitution: {0}", _
Regex.Replace(input, pattern, substitution))
End Sub
End Module
' The example displays the following output:
' Original string: ABC123DEF456
' String with substitution: ABCABC123DEF456DEFABC123DEF456
Пример из сети разработчиков Microsoft Official [2]
И последнее, но не менее важное выражение - $$
, которое переводится в выражение регулярных выражений, будет таким же, как \$
(escape-версия буквального $ ).
Если вы хотите сопоставить строку вроде этого: USD: $3.99
например, и хотите сохранить 3.99
, но замените ее на $3.99
только одним регулярным выражением, вы можете использовать:
Regex: /USD:\s+\$([\d.]+)/
Input: "USD: $3.99"
Replacement: "$$$1"
To Store: "$1"
Output: "$3.99"
Stored: "3.99"
Если вы хотите проверить это с помощью Javascript, вы можете использовать код:
var rgx = /USD:\s+\$([\d.]+)/;
var text = "USD: $3.99";
var stored = parseFloat(rgx.exec(text)[1]);
console.log(stored); //Logs 3.99
console.log(text.replace(rgx, "$$$1")); //Logs $3.99
Рекомендации
[1]: Подстановка последней захваченной группы
[2]: Подстановка всей входной строки