如何在C#regex中使用内联修饰符?

如何使用内联修饰符而不是RegexOptions.Option

例如:

 Regex MyRegex = new Regex(@"[az]+", RegexOptions.IgnoreCase); 

如何使用内联字符i重写它?

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

您可以使用内联修饰符,如下所示:

 // case insensitive match Regex MyRegex = new Regex(@"(?i)[az]+"); // case insensitive match 

或者,通过添加减号来反转修饰符的含义:

 // case sensitive match Regex MyRegex = new Regex(@"(?-i)[az]+"); // case sensitive match 

或者,打开和关闭它们:

 // case sensitive, then case-insensitive match Regex MyRegex = new Regex(@"(?-i)[az]+(?i)[kn]+"); 

或者,您可以使用冒号:和分组括号使用mode-modifier span语法,该修饰符将修饰符仅限定为该组:

 // case sensitive, then case-insensitive match Regex MyRegex = new Regex(@"(?-i:[az]+)(?i:[kn]+)"); 

如果你发现更清晰(?i)(?s)(?-m)text (我没有),你可以像这样使用多个修饰符(?is-m:text) ,或者在另一个之后使用多个修饰符。 当您使用开/关切换语法时,请注意修饰符一直有效,直到下一个开关或正则表达式结束。 相反,使用模式修改的跨度,跨度后将应用默认行为。

最后: .NET中允许的修饰符是 (使用减号来反转模式):

x允许空格和注释
单线模式
m多线模式
i不区分大小写
n只允许显式捕获(特定于.NET)

以这种方式使用它:

 Regex MyRegex = new Regex(@"(?i:[az]+)"); 

使用(?为模式添加内联选项。 在这种情况下,IgnoreCase的选项为“i”。

通过在上面指定冒号,您可以将选项设置为该模式。 要使该选项适用于整个模式,您可以在开头单独设置它:

 @"(?i)[az]+" 

也可以使用多个选项并打开和关闭它们:

 // On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace @"(?in-x)[az]+" 

这允许模式中的灵活性在正则表达式的不同点处启用/禁用选项,这在整个模式上使用RegexOptions时是不可能的。

这是一个稍微深入的例子。 我鼓励您使用它来了解选项何时生效。

 string input = "H2O (water) is named Dihydrogen Monoxide or Hydrogen Hydroxide. The H represents a hydrogen atom, and O is an Oxide atom."; // n = explicit captures // x = ignore pattern whitespace // -i = remove ignorecase option string pattern = @"di?(?nx-i) ( hydrogen ) | oxide"; var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); Console.WriteLine("Total Matches: " + matches.Count); foreach (Match match in matches) { Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups[1].Captures.Count); } Console.WriteLine(); // n = explicit captures // x = ignore pattern whitespace // -i = remove ignorecase option // -x = remove ignore pattern whitespace pattern = @"di?(?nx-i) (? hydrogen ) (?-x)|oxide"; matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); Console.WriteLine("Total Matches: " + matches.Count); foreach (Match match in matches) { Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups["H"].Captures.Count); } 

上面的输出是:

 Total Matches: 3 Match: Dihydrogen - Groups: 0 Match: oxide - Groups: 0 Match: oxide - Groups: 0 Total Matches: 3 Match: Dihydrogen - Groups: 1 Match: oxide - Groups: 0 Match: oxide - Groups: 0 

在两种模式中都使用RegexOptions.IgnoreCase ,它允许“di”不区分大小写,因此匹配“Dihydrogen”(大写字母D)。 由于显式捕获已启用,因此第一个示例无法为( hydrogen )设置任何组,因为它不使用命名组,这是显式捕获的要求。 第二种模式确实有1组,因为它使用(? hydrogen )

接下来,注意第二个图案被修改为最后使用(?-x)|oxide 。 由于在氢捕获后禁用了IgnorePatternWhitespace ,因此必须通过不使用额外的空白(与第一个模式相比)正确形成模式的其余部分,直到(?x)在模式中稍后打开。 这没有任何实际意义,但只是展示了内联选项的深入使用,以展示它们实际启动的时间。