如何在C#正则表达式中使用内联修饰符?

Ail*_*lyn 17 .net c# regex

如何使用内联修改器而不是RegexOptions.Option

例如:

Regex MyRegex = new Regex(@"[a-z]+", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

如何使用内联字符重写此内容i

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

Abe*_*bel 33

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

// case insensitive match
Regex MyRegex = new Regex(@"(?i)[a-z]+");  // case insensitive match
Run Code Online (Sandbox Code Playgroud)

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

// case sensitive match
Regex MyRegex = new Regex(@"(?-i)[a-z]+");  // case sensitive match
Run Code Online (Sandbox Code Playgroud)

或者,打开和关闭它们:

// case sensitive, then case-insensitive match
Regex MyRegex = new Regex(@"(?-i)[a-z]+(?i)[k-n]+");
Run Code Online (Sandbox Code Playgroud)

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

// case sensitive, then case-insensitive match
Regex MyRegex = new Regex(@"(?-i:[a-z]+)(?i:[k-n]+)");
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ahm*_*eed 7

以这种方式使用它:

Regex MyRegex = new Regex(@"(?i:[a-z]+)");
Run Code Online (Sandbox Code Playgroud)

使用的方式为模式添加内联选项(?<option>:<pattern>).在这种情况下,IgnoreCase的选项为"i".

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

@"(?i)[a-z]+"
Run Code Online (Sandbox Code Playgroud)

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

// On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace
@"(?in-x)[a-z]+"
Run Code Online (Sandbox Code Playgroud)

这允许模式的灵活性以在正则表达式的不同点处启用/禁用选项,这在使用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) (?<H> 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);
}
Run Code Online (Sandbox Code Playgroud)

上面的输出是:

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
Run Code Online (Sandbox Code Playgroud)

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

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