Try this
(?:(?<=^|s)(?=S)|(?<=S|^)(?=s))this (?:(?<=S)(?=s|$)|(?<=s)(?=S|$))
See it here on Regexr
This will also work for pattern that starts with a whitespace.
Basically, what I am doing is to define a custom "word" boundary. But it is not true on a W=>w
or a w=>W
change, its true on a S=>s
or a s=>S
change!
Here is an example in c#:
string str = "Hi this is stackoverflow";
string pattern = Regex.Escape("this");
MatchCollection result = Regex.Matches(str, @"(?:(?<=^|s)(?=S)|(?<=S|^)(?=s))" + pattern + @"(?:(?<=S)(?=s|$)|(?<=s)(?=S|$))", RegexOptions.IgnoreCase);
Console.WriteLine("Amount of matches: " + result.Count);
foreach (Match m in result)
{
Console.WriteLine("Matched: " + result[0]);
}
Console.ReadLine();
Update:
This "Whitespace" boundary can be done more general, so that on each side of the pattern is the same expression, like this
(?:(?<=^|s)(?=S|$)|(?<=^|S)(?=s|$))
In c#:
MatchCollection result = Regex.Matches(str, @"(?:(?<=^|s)(?=S|$)|(?<=^|S)(?=s|$))" + pattern + @"(?:(?<=^|s)(?=S|$)|(?<=^|S)(?=s|$))", RegexOptions.IgnoreCase);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…