Case insensitive Regex without using RegexOptions enumeration

Is it possible to do a case insensitive match in C# using the Regex class without setting the RegexOptions.IgnoreCase flag?

What I would like to be able to do is within the regex itself define whether or not I want the match operation to be done in a case insensitive manner.

I would like this regex, taylor, to match on the following values:

  • Taylor
  • taylor
  • taYloR

Solution 1:

MSDN Documentation

(?i)taylor matches all of the inputs I specified without having to set the RegexOptions.IgnoreCase flag.

To force case sensitivity I can do (?-i)taylor.

It looks like other options include:

  • i, case insensitive
  • s, single line mode
  • m, multi line mode
  • x, free spacing mode

Solution 2:

As you already found out, (?i) is the in-line equivalent of RegexOptions.IgnoreCase.

Just FYI, there are a few tricks you can do with it:

Regex:
    a(?i)bc
Matches:
    a       # match the character 'a'
    (?i)    # enable case insensitive matching
    b       # match the character 'b' or 'B'
    c       # match the character 'c' or 'C'

Regex:
    a(?i)b(?-i)c
Matches:
    a        # match the character 'a'
    (?i)     # enable case insensitive matching
    b        # match the character 'b' or 'B'
    (?-i)    # disable case insensitive matching
    c        # match the character 'c'

Regex:    
    a(?i:b)c
Matches:
    a       # match the character 'a'
    (?i:    # start non-capture group 1 and enable case insensitive matching
      b     #   match the character 'b' or 'B'
    )       # end non-capture group 1
    c       # match the character 'c'

And you can even combine flags like this: a(?mi-s)bc meaning:

a          # match the character 'a'
(?mi-s)    # enable multi-line option, case insensitive matching and disable dot-all option
b          # match the character 'b' or 'B'
c          # match the character 'c' or 'C'

Solution 3:

As spoon16 says, it's (?i). MSDN has a list of regular expression options which includes an example of using case-insensitive matching for just part of a match:

 string pattern = @"\b(?i:t)he\w*\b";

Here the "t" is matched case-insensitively, but the rest is case-sensitive. If you don't specify a subexpression, the option is set for the rest of the enclosing group.

So for your example, you could have:

string pattern = @"My name is (?i:taylor).";

This would match "My name is TAYlor" but not "MY NAME IS taylor".