This code
Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase);
after compilation looks like this in ILSpy:
Regex regex = new Regex("blah", RegexOptions.None);
Why does it happen and can it be the reason of regex not matching in .Net 3.5? On 4.5 it works.
RegexOptions.Singleline & RegexOptions.IgnoreCase
is a bitwise AND, and resolves to 0 (i.e. RegexOptions.None
).
The RegexOptions
enum looks like this:
[Flags]
public enum RegexOptions
{
None = 0,
IgnoreCase = 1,
Multiline = 2,
ExplicitCapture = 4,
Compiled = 8,
Singleline = 16,
IgnorePatternWhitespace = 32,
RightToLeft = 64,
ECMAScript = 256,
CultureInvariant = 512,
}
So, in binary, we have:
RegexOptions.SingleLine == 10000
RegexOptions.IngoreCase == 00001
When applying a bitwise AND, we get :
10000
AND 00001
-----
00000
Replace with
RegexOptions.Singleline | RegexOptions.IgnoreCase
which gives:
10000
OR 00001
-----
10001
That ILSpy will decompile in:
Regex regex = new Regex("blah", RegexOptions.Singleline | RegexOptions.IgnoreCase);
But I don't know what "works" in .Net 4.5. I just compiled your code, and ILSpy also outputs:
Regex regex = new Regex("blah", RegexOptions.None);
as intended.