Use Regex Subtraction
[\p{P}-[._]]
See the .NET Regex documentation. I’m not sure if other flavors support it.
C# example
string pattern = @"[\p{P}\p{S}-[._]]"; // added \p{S} to get ^,~ and ` (among others)
string test = @"_""'a:;%^&*~`bc!@#.,?";
MatchCollection mx = Regex.Matches(test, pattern);
foreach (Match m in mx)
{
Console.WriteLine("{0}: {1} {2}", m.Value, m.Index, m.Length);
}
Explanation
The pattern is a Character Class Subtraction. It starts with a standard character class like [\p{P}]
and then adds a Subtraction Character Class like -[._]
, which says to remove the .
and _
. The subtraction is placed inside the [ ]
after the standard class guts.