【问题标题】:Replace/Remove characters that do not match the Regular Expression (.NET)替换/删除与正则表达式 (.NET) 不匹配的字符
【发布时间】:2011-09-03 12:13:00
【问题描述】:

我有一个正则表达式来验证一个字符串。但是现在我想删除所有与我的正则表达式不匹配的字符。

例如

regExpression = @"^([\w\'\-\+])"

text = "This is a sample text with some invalid characters -+%&()=?";

//Remove characters that do not match regExp.

result = "This is a sample text with some invalid characters -+";

关于如何使用 RegExpression 确定有效字符并删除所有其他字符的任何想法。

非常感谢

【问题讨论】:

    标签: c# regex replace remove-if


    【解决方案1】:

    就这么简单:

    var match = Regex.Match(text, regExpression);
    string result = "";
    if(match.Success)
        result = match.Value;
    

    删除不匹配的字符与保留匹配的字符相同。这就是我们在这里所做的。

    如果表达式在您的文本中匹配多次,您可以使用:

    var result = Regex.Matches(text, regExpression).Cast<Match>()
                      .Aggregate("", (s, e) => s + e.Value, s => s);
    

    【讨论】:

    • 嗨丹尼尔,我尝试了你的解决方案,但正如你提到的,我的正则表达式将匹配不止一次,因为我需要它来删除无效字符但保留所有有效字符。我无法使用第二段代码,我在Cast&lt;Match&gt;() 中收到错误我应该用其他东西替换该部分还是应该在您键入时使用您的代码。谢谢
    • (1) 您提供的正则表达式没有按照您的预期执行。 (2) 你得到的错误是什么?我实际上测试了该代码并且它有效。
    • (1) 为什么正则表达式有误?或者应该如何?我对类似的方法使用相同的 RegEx 来验证它是否是有效的字符串,但是如果它与 RegEx 匹配,这个新方法不是返回 true,而是删除/替换无效字符,我想我需要使用两个不同的RegEx 作为一个不会在这两种情况下都起作用,对吗? (2) 我忘了添加 System.Linq 的添加指令
    • 正则表达式匹配一个单词一个以下字符:' - + 开头行的
    • 你的方法和@emfurry 的方法有什么区别优势/劣势?有什么我应该考虑的吗?
    【解决方案2】:

    我相信你可以在一行中做到这一点(白名单字符并替换其他所有内容):

    var result = Regex.Replace(text, @"[^\w\s\-\+]", "");
    

    从技术上讲,它会产生这个: “这是一个带有一些无效字符的示例文本 - +” 这与您的示例略有不同(- 和 + 之间的额外空格)。

    【讨论】:

    • 如果匹配文本的正则表达式更复杂,这将不起作用。您可以轻松地否定每个正则表达式。
    • 是的,但是发帖人说他/她需要在角色级别上删除,这应该足够了。此外,如果您需要更高的精度,请考虑:var result = Regex.Replace(text, @"[^\w]", m =&gt; "%&amp;=?()".Contains(m.Value) ? "" : m.Value); 您可以用任何代码替换我的 MatchEvaluator 以确定是否保留字符。
    【解决方案3】:

    感谢Replace chars if not match 的回答我已经创建了a helper method to strips unaccepted characters

    允许的模式应该是正则表达式格式,期望它们用方括号括起来。一个函数将在打开方括号后插入一个波浪号。 我预计它不适用于所有描述有效字符集的 RegEx,但它适用于我们正在使用的相对简单的字符集。

     /// <summary>
                   /// Replaces  not expected characters.
                   /// </summary>
                   /// <param name="text"> The text.</param>
                   /// <param name="allowedPattern"> The allowed pattern in Regex format, expect them wrapped in brackets</param>
                   /// <param name="replacement"> The replacement.</param>
                   /// <returns></returns>
                   /// //        https://stackoverflow.com/questions/4460290/replace-chars-if-not-match.
                   //https://stackoverflow.com/questions/6154426/replace-remove-characters-that-do-not-match-the-regular-expression-net
                   //[^ ] at the start of a character class negates it - it matches characters not in the class.
                   //Replace/Remove characters that do not match the Regular Expression
                   static public string ReplaceNotExpectedCharacters( this string text, string allowedPattern,string replacement )
                  {
                         allowedPattern = allowedPattern.StripBrackets( "[", "]" );
                          //[^ ] at the start of a character class negates it - it matches characters not in the class.
                          var result = Regex .Replace(text, @"[^" + allowedPattern + "]", replacement);
                          return result;
                  }
    
    static public string RemoveNonAlphanumericCharacters( this string text)
                  {
                          var result = text.ReplaceNotExpectedCharacters(NonAlphaNumericCharacters, "" );
                          return result;
                  }
            public const string NonAlphaNumericCharacters = "[a-zA-Z0-9]";
    

    我的 StringHelper 类有几个函数 http://geekswithblogs.net/mnf/archive/2006/07/13/84942.aspx , 在这里使用。

               /// <summary>
               /// ‘StripBrackets checks that starts from sStart and ends with sEnd (case sensitive).
               ///           ‘If yes, than removes sStart and sEnd.
               ///           ‘Otherwise returns full string unchanges
               ///           ‘See also MidBetween
               /// </summary>
    
               public static string StripBrackets( this string str, string sStart, string sEnd)
              {
                      if (CheckBrackets(str, sStart, sEnd))
                     {
                           str = str.Substring(sStart.Length, (str.Length – sStart.Length) – sEnd.Length);
                     }
                      return str;
              }
               public static bool CheckBrackets( string str, string sStart, string sEnd)
              {
                      bool flag1 = (str != null ) && (str.StartsWith(sStart) && str.EndsWith(sEnd));
                      return flag1;
              }
    

    【讨论】:

    • 它没有回答如何替换/删除不在匹配组中的字符
    • 注意:没有提供函数 StripBrackets。 @"[^" + allowedPattern + "]" 也不适用于任意模式,但是对于简单的情况,这是一个不错的解决方案。
    • @shelbypereira,StripBrackets 在链接的文章中,我现在已将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2021-09-17
    • 1970-01-01
    • 2021-04-10
    • 2022-12-01
    • 2011-12-02
    相关资源
    最近更新 更多