如何使用内联修饰符而不是RegexOptions.Option
?
例如:
Regex MyRegex = new Regex(@"[a-z]+", RegexOptions.IgnoreCase);
如何使用内联字符i
重写此内容?
答案 0 :(得分:33)
您可以按如下方式使用内联修饰符:
// case insensitive match
Regex MyRegex = new Regex(@"(?i)[a-z]+"); // case insensitive match
或者,通过添加减号来反转修饰符的含义:
// case sensitive match
Regex MyRegex = new Regex(@"(?-i)[a-z]+"); // case sensitive match
或者,打开和关闭它们:
// case sensitive, then case-insensitive match
Regex MyRegex = new Regex(@"(?-i)[a-z]+(?i)[k-n]+");
或者,您可以使用冒号:
和分组括号来使用 mode-modifier span 语法,该修饰符将修饰符范围仅限于该组:
// case sensitive, then case-insensitive match
Regex MyRegex = new Regex(@"(?-i:[a-z]+)(?i:[k-n]+)");
你可以像这样(?is-m:text)
一次使用多个修饰符,或者如果你发现更清晰(?i)(?s)(?-m)text
(我没有),可以一个接一个地使用。当您使用开/关切换语法时,请注意修饰符一直有效,直到下一个开关或正则表达式结束。相反,使用模式修改的跨度,在跨度之后将应用默认行为。
最后:the allowed modifiers in .NET are(使用减号来反转模式):
x
允许空白和评论
s
单行模式
m
多行模式
i
不区分大小写
n
仅允许显式捕获(特定于.NET)
答案 1 :(得分:7)
以这种方式使用它:
Regex MyRegex = new Regex(@"(?i:[a-z]+)");
使用(?<option>:<pattern>)
为您的模式添加内联选项。在这种情况下,IgnoreCase的选项为“i”。
通过在上面指定冒号,您可以将选项设置为该模式。要使该选项适用于整个模式,您可以单独设置它:
@"(?i)[a-z]+"
也可以使用多个选项并打开和关闭它们:
// On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace
@"(?in-x)[a-z]+"
这允许模式的灵活性,以在正则表达式的不同点启用/禁用选项,这在整个模式上使用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);
}
以上的输出是:
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个组,因为它使用(?<H> hydrogen )
。
接下来,请注意第二个模式已修改为最后使用(?-x)|oxide
。由于 IgnorePatternWhitespace 在氢捕获后被禁用,因此必须通过不使用额外的空格(与第一个模式相比)正确形成模式的其余部分,直到模式中的(?x)
被打开为止。这没有任何实际意义,只是展示了内联选项的深入使用,以展示它们实际启动的时间。