Regular Expressions
正規表現による置換
サーチ…
パラメーター
列をなして | 説明 |
---|---|
$ number | グループ番号と一致する部分文字列に置き換えます。 |
$ {name} | 名前の付いたグループ名でマッチした部分文字列に置き換えます。 |
$$ | 結果(置換)文字列でエスケープされた '$'文字。 |
$& ($ 0) | 一致した文字列全体と置き換えます。 |
$ + ($&) | 一致したテキストをキャプチャされた最後のグループに置き換えます。 |
$ ` | 一致するすべてのテキストを、一致する前のすべての一致しないテキストに置き換えます。 |
$ ' | 一致したすべてのテキストを、一致した後のすべての一致しないテキストに置き換えます。 |
$ _ | 一致したすべてのテキストを文字列全体に置き換えます。 |
注意: | イタリック体とは、文字列が揮発性であることを意味します(正規表現の味によって異なります)。 |
代替の基礎
テキストを正規表現に置き換える最も一般的で便利な方法の1つは、 キャプチャグループを使用することです。
または名前付きキャプチャ・グループであっても、データを格納または置換するための参照として使用できます。
正規表現のドキュメントには2つの用語がよく似ているので、 代入 (つまり$1
)とバックリファレンス (つまり\1
)を混同しないことが重要です。置換用語は置換テキストで使用されます。純粋なRegex式の逆参照。いくつかのプログラミング言語が両方の置換を受け入れても、それは奨励的ではありません。
この正規表現があるとしましょう: /hello(\s+)world/i
。 $number
が参照されるたびに(この場合、 $1
)、 \s+
マッチした空白が置き換えられます。
同じ結果が正規表現で公開されます: /hello(?<spaces>\s+)world/i
。ここに名前付きグループがあるので、 ${spaces}
も使用でき${spaces}
。
この同じ例では、 $0
または$&
使用することもできます( 注: $&
は、代わりに他の正規表現エンジンでLASTキャプチャグループを取得する$+
として使用できます)。作業する正規表現の味に応じて、一致するテキスト全体を取得します。 ( $&
は文字列のhEllo woRld
を返します: hEllo woRld of Regex!
)
$number
と${name}
構文を使って、ジョン・レノンの適応引用符を使って簡単な置換の例を見てみましょう: 名前付きキャプチャグループの例:
高度な交換
いくつかのプログラミング言語には、一致したテキストをキャプチャされた最後のグループに置き換える$+
term(C#、Perl、VBなど)のような独自のRegexの特質があります。
例:
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公式の開発者ネットワーク[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公式の開発者ネットワーク[2]の例
最後の代りの代入項は$$
。これは正規表現に変換されたものは\$
(リテラル$のエスケープされたバージョン)と同じです。
例えば: USD: $3.99
ような文字列と一致させたい場合は、 3.99
を保存したいが、 $3.99
と置き換える正規表現は1つだけです:
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]: 入力文字列全体の置換