【发布时间】:2009-08-30 14:11:15
【问题描述】:
我试图了解 (?
【问题讨论】:
-
这通常用于反向引用问题。见:regular-expressions.info/named.html
我试图了解 (?
【问题讨论】:
来自Mastering Regular Expressions:
命名捕获:
\b(?<Area>\d\d\d\)-(?<Exch>\d\d\d)-(?<Num>\d\d\d\d)\b
这用美国电话号码的组成部分“填充名称”Area、Exch 和 Num。然后程序可以通过其名称引用每个匹配的子字符串,例如,VB.NET 和大多数其他 .NET 语言中的 RegexObj.Groups("Area"),C# 中的 RegexObj.Groups["Area"],RegexObj.group( Python 中的 "Area") 和 PHP 中的 $matches["Area"]。 结果是更清晰的代码。
在正则表达式本身中,捕获的文本可通过 .NET 的 \k 和 Python 和 PHP 的 (?P=Area) 获得。
对于 Python 和 .NET(但不是 PHP),您可以在同一个表达式中多次使用同一个名称。
【讨论】:
此功能使您可以使用友好名称而不是索引轻松引用从代码(参见示例)或正则表达式本身捕获的内容。 一个简单的例子:
Regex regex = new Regex(@"(?<foo>[fF][oO][oO]) \k<foo>");
foreach (Match match in regex.Matches("bar fOO foO foO f0O"))
{
Console.WriteLine(match);
}
打印
呸呸呸此正则表达式允许您捕获包含任何大小写字母组合的“foo”,但前提是它前面有另一个具有完全相同的大写小写字母集的“foo”。您还可以使用 match.Groups["name"] 语法引用您的组,因此在本例中,match.Groups["foo"] 将返回“foO”。
编辑:将使用 \k
【讨论】: