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