你能构建一个RegEx来用下划线替换不需要的字符吗?

Mar*_*eIV 5 c# regex replace

我正在尝试编写一个字符串'clean-up'函数,它只允许使用字母数字字符,以及其他一些字符,例如下划线,句点和减号(破折号)字符.

目前我们的函数使用源字符串的直接char迭代,但我正在尝试将其转换为RegEx,因为从我一直阅读的内容来看,它更清晰,更高效(在直接迭代中,这似乎是向后的,但是在我得到一个有效的RegEx之前,我无法对其进行分析.)

这个问题对我来说是双重的.一,我知道以下正则表达式......

[a-zA-Z0-9]
Run Code Online (Sandbox Code Playgroud)

...匹配一系列字母数字字符,但我如何还包括下划线,句号和减号字符?你只是用'\'字符来逃避它们并将它们放在括号之间与其余部分?

其次,对于任何不属于匹配的角色(即其他标点符号,如'?'),我们希望将其替换为下划线.

我的想法是匹配一系列所需的字符,我们匹配一个不在所需范围内的单个字符,然后替换它.我认为RegEx就是将克拉作为括号之间的第一个字符包括在内......

[^a-zA-Z0-9]
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Jam*_*See 5

可能最有效的方法是设置一个静态正则表达式来描述您要替换的字符.

public static class StringCleaner
{    
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public static string ReplaceInvalidChars(string input)
    {
        return invalidChars.Replace(input, "_");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您不希望正则表达式替换行尾和空格(如空格和制表符),则需要使用稍微不同的表达式.

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

此外,以下是您必须转义以匹配文字字符的规则:

在由方括号表示的集合中,您必须-#]\在它们出现的任何位置转义这些字符,并且^只有当它出现在集合的第一个位置以匹配文字字符时.在集合之外,您必须转义这些字符:.$^|{}[]()+?#匹配文字字符.

有关更多信息,请参阅以下文档: