【问题标题】:Can you construct a RegEx to replace unwanted characters with the underscore?你能构造一个正则表达式来用下划线替换不需要的字符吗?
【发布时间】:2013-07-07 08:00:35
【问题描述】:

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

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

对我来说,这个问题有两个方面。一、我知道下面的正则表达式...

[a-zA-Z0-9]

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

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

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

[^a-zA-Z0-9]

这是正确的方法吗?

【问题讨论】:

  • Regex.Replace() 方法是你所需要的
  • 我想通了,但请看我的问题,或者说上面有两个与此相关的问题。
  • 您想反转您的角色类别。 IE。 [^a-zA-Z0-9],它将匹配所有字母数字。

标签: c# regex replace


【解决方案1】:

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

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);

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

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

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

【讨论】:

  • 实际上,我确实希望它替换所有空格和行尾(以及行首!)。它们不是有效字符,因此您的第一个字符是正确的。但是,如果我错了,请纠正我,但您的文字字符串以“@”字符开头,在我看来,这看起来像 Objective C,而不是 C#。 ...还是我错过了什么?
  • 我错过了什么! :) 我现在知道在 C# 中启动一个字符串基本上会为您转义整个字符串。我喜欢!您将获得完整的公认答案。谢谢! :)
  • 是的,在 C# 中以 @" 开头的字符串使其成为文字。这是语言规范中解释它的部分:msdn.microsoft.com/en-us/library/aa691090(v=VS.71).aspx
【解决方案2】:

如果您尝试删除不想要的字符,Regex.Replace 会更好地为您服务:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 这不是正则表达式代码,因此不适用于所提出的问题。
    【解决方案4】:

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

    string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_");
    

    【讨论】:

    • 你不应该在末尾转义那个连字符(或者它是否隐式转义,因为它在末尾
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2017-12-13
    相关资源
    最近更新 更多