後読みサポートについて
主要な正規表現フレーバーでは、後読みのサポートが異なります。特定の制限を課すものもあれば、まったくサポートしないものもあります。
- Javascript: サポートされていません
- Python: 固定長のみ
- Java: 有限長のみ
- .NET: 制限なし
参考文献
パイソン
\d{1,2}
固定長の後読みのみがサポートされている Python では、明らかに固定長がないため、元のパターンでエラーが発生します。2 つの異なる固定長の後読みを交互に行うことで、これを「修正」できます。たとえば、次のようになります。
(?<=^\d\/)\d{1,2}|(?<=^\d\d\/)\d{1,2}
または、両方の後読みを非キャプチャ グループの代替として配置することもできます。
(?:(?<=^\d\/)|(?<=^\d\d\/))\d{1,2}
\d
(括弧なしで使用できることに注意してください)。
そうは言っても、代わりにキャプチャ グループを使用する方がおそらくはるかに簡単です。
^\d{1,2}\/(\d{1,2})
findall
グループが 1 つしかない場合は、グループ 1 がキャプチャしたものを返すことに注意してください。グループのキャプチャは、後読みよりも広くサポートされており、多くの場合、より読みやすいパターンにつながります (この場合のように)。
このスニペットは、上記のすべてのポイントを示しています。
p = re.compile(r'(?:(?<=^\d\/)|(?<=^\d\d\/))\d{1,2}')
print(p.findall("12/34/56")) # "[34]"
print(p.findall("1/23/45")) # "[23]"
p = re.compile(r'^\d{1,2}\/(\d{1,2})')
print(p.findall("12/34/56")) # "[34]"
print(p.findall("1/23/45")) # "[23]"
p = re.compile(r'(?<=^\d{1,2}\/)\d{1,2}')
# raise error("look-behind requires fixed-width pattern")
参考文献
ジャワ
\d{1,2}
Java は有限長の後読みのみをサポートするため、元のパターンで like を使用できます。これは、次のスニペットで示されています。
String text =
"12/34/56 date\n" +
"1/23/45 another date\n";
Pattern p = Pattern.compile("(?m)(?<=^\\d{1,2}/)\\d{1,2}");
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group());
} // "34", "23"
すべての行の先頭に一致するよう(?m)
に埋め込まれていることに注意してください。は文字列リテラルのエスケープ文字であるため、Java ではバックスラッシュを 1 つ取得するように記述する必要があることにも注意してください。Pattern.MULTILINE
^
\
"\\"
Cシャープ
C# は、後読みで完全な正規表現をサポートしています。+
次のスニペットは、後読みで繰り返しを使用する方法を示しています。
var text = @"
1/23/45
12/34/56
123/45/67
1234/56/78
";
Regex r = new Regex(@"(?m)(?<=^\d+/)\d{1,2}");
foreach (Match m in r.Matches(text)) {
Console.WriteLine(m);
} // "23", "34", "45", "56"
Java とは異なり、C# では@-quoted stringを使用できるため、エスケープする必要はありません\
。
完全を期すために、C# でグループのキャプチャ オプションを使用する方法を次に示します。
Regex r = new Regex(@"(?m)^\d+/(\d{1,2})");
foreach (Match m in r.Matches(text)) {
Console.WriteLine("Matched [" + m + "]; month = " + m.Groups[1]);
}
前のを指定すると、次のtext
ように出力されます。
Matched [1/23]; month = 23
Matched [12/34]; month = 34
Matched [123/45]; month = 45
Matched [1234/56]; month = 56
関連する質問