6

我正在尝试编写一个字符串“清理”函数,该函数只允许使用字母数字字符,以及一些其他字符,例如下划线、句点和减号(破折号)字符。

目前我们的函数使用源字符串的直接 char 迭代,但我正在尝试将其转换为 RegEx,因为从我一直在阅读的内容来看,它更干净,性能更高(这对我来说似乎在直接迭代中倒退,但是在我得到一个正常工作的正则表达式之前,我无法对其进行分析。)

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

[a-zA-Z0-9]

...匹配一系列字母数字字符,但我如何还包括下划线、句点和减号?您是否只是用“\”字符转义它们并将它们与其余部分放在括号之间?

其次,对于不属于匹配项的任何字符(即其他标点符号,例如“?”),我们希望将其替换为下划线。

我的想法是改为匹配一系列所需的字符,我们匹配一个不在所需范围内的字符,然后替换它。我认为正则表达式是将克拉作为括号之间的第一个字符,如下所示......

[^a-zA-Z0-9]

这是正确的方法吗?

4

4 回答 4

7

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

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, "_");
    }
}

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

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

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

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

有关详细信息,请参阅以下文档:

于 2013-07-09T17:42:40.777 回答
3

如果您尝试删除您不想要的字符,最好通过以下方式为您服务Regex.Replace

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_");

要包含“-”字符,您可以使用正则表达式 OR 来包含该字符,尽管可能有一种方法可以将其包含在字符类中,但目前它正在逃避我。

编辑:您实际上不需要明确包含连字符,因为它无论如何都不匹配类。也就是说,如果你想用下划线替换连字符,只需[^a-zA-Z0-9_.]用作你的类......任何与这些类不匹配的东西都将被替换。但是在类中包含连字符的正确方法是使用反斜杠 ( \-) 对其进行转义,或者您可以将其放在类列表的开头:[^-a-zA-Z0-9_.].

于 2013-07-09T16:03:51.960 回答
0

我认为使用字符串的 Replace 方法会很完美。

public string StringClean(string source, char replacement, char[] targets)
{
  foreach(char c in targets)
  {
  //...
  }
}

(不在 VS 中,所以可能不是完美的代码)

于 2013-07-09T16:05:40.947 回答
0

如果您需要用下划线替换所有不在您描述的模式中的字符,请执行以下操作:

string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_");
于 2013-07-09T16:44:55.260 回答